1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift open source project
//
// Copyright (c) 2020-2021 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See http://swift.org/LICENSE.txt for license information
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
import struct Foundation.Data
import class Foundation.DateFormatter
import class Foundation.JSONDecoder
import class Foundation.JSONEncoder
extension JSONDecoder {
public static func makeWithDefaults(dateDecodingStrategy: DateDecodingStrategy = .iso8601) -> JSONDecoder {
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = dateDecodingStrategy
return decoder
}
}
extension JSONEncoder {
public static func makeWithDefaults(
prettified: Bool = true,
dateEncodingStrategy: DateEncodingStrategy = .iso8601
) -> JSONEncoder {
Self.makeWithDefaults(
sortKeys: prettified,
prettyPrint: prettified,
escapeSlashes: !prettified,
dateEncodingStrategy: dateEncodingStrategy
)
}
public static func makeWithDefaults(
sortKeys: Bool,
prettyPrint: Bool,
escapeSlashes: Bool,
dateEncodingStrategy: DateEncodingStrategy = .iso8601
) -> JSONEncoder {
let encoder = JSONEncoder()
var outputFormatting: JSONEncoder.OutputFormatting = []
if sortKeys {
outputFormatting.insert(.sortedKeys)
}
if prettyPrint {
outputFormatting.insert(.prettyPrinted)
}
if !escapeSlashes {
outputFormatting.insert(.withoutEscapingSlashes)
}
encoder.outputFormatting = outputFormatting
encoder.dateEncodingStrategy = dateEncodingStrategy
return encoder
}
}
extension JSONDecoder {
public func decode<T: Decodable>(path: AbsolutePath, fileSystem: FileSystem, as kind: T.Type) throws -> T {
let data: Data = try fileSystem.readFileContents(path)
return try self.decode(kind, from: data)
}
}
extension JSONEncoder {
public func encode<T: Encodable>(path: AbsolutePath, fileSystem: FileSystem, _ value: T) throws {
let data = try self.encode(value)
try fileSystem.writeFileContents(path, data: data)
}
}
|