forked from loafle/openapi-generator-original
[Swift4] Expanding CodableHelper with added date and JSON customisations (#3365)
* Expanding CodableHelper with a more customisable dateFormatter and JSON en-/decoder. * Ran ./bin/swift4-petstore.sh * Ran ./bin/swift4-petstore-all.sh again after merge from master. * Ran ./bin/swift4-petstore-all.sh again after building. * Ran ./bin/swift4-petstore-all.sh again after rebase latest from upstream master. * sync master, update samples * Built and ran ./bin/swift4-petstore-all.sh * Re-adding code which disappeared in rebase from master. * Fixed test * [swift] remove old classes
This commit is contained in:
committed by
William Cheng
parent
5f5401bca6
commit
f6dbd48b9c
@@ -34,7 +34,7 @@ open class Swift4TestAPI {
|
||||
|
||||
var url = URLComponents(string: URLString)
|
||||
url?.queryItems = APIHelper.mapValuesToQueryItems([
|
||||
"client_id": clientId
|
||||
"client_id": clientId.encodeToJSON()
|
||||
])
|
||||
|
||||
let requestBuilder: RequestBuilder<GetAllModelsResult>.Type = TestClientAPI.requestBuilderFactory.getBuilder()
|
||||
|
||||
@@ -11,27 +11,48 @@ public typealias EncodeResult = (data: Data?, error: Error?)
|
||||
|
||||
open class CodableHelper {
|
||||
|
||||
public static var dateformatter: DateFormatter?
|
||||
private static var customDateFormatter: DateFormatter?
|
||||
private static var defaultDateFormatter: DateFormatter = {
|
||||
let dateFormatter = DateFormatter()
|
||||
dateFormatter.calendar = Calendar(identifier: .iso8601)
|
||||
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
|
||||
dateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
|
||||
dateFormatter.dateFormat = Configuration.dateFormat
|
||||
return dateFormatter
|
||||
}()
|
||||
private static var customJSONDecoder: JSONDecoder?
|
||||
private static var defaultJSONDecoder: JSONDecoder = {
|
||||
let decoder = JSONDecoder()
|
||||
decoder.dateDecodingStrategy = .formatted(CodableHelper.dateFormatter)
|
||||
return decoder
|
||||
}()
|
||||
private static var customJSONEncoder: JSONEncoder?
|
||||
private static var defaultJSONEncoder: JSONEncoder = {
|
||||
let encoder = JSONEncoder()
|
||||
encoder.dateEncodingStrategy = .formatted(CodableHelper.dateFormatter)
|
||||
encoder.outputFormatting = .prettyPrinted
|
||||
return encoder
|
||||
}()
|
||||
|
||||
public static var dateFormatter: DateFormatter {
|
||||
get { return self.customDateFormatter ?? self.defaultDateFormatter }
|
||||
set { self.customDateFormatter = newValue }
|
||||
}
|
||||
public static var jsonDecoder: JSONDecoder {
|
||||
get { return self.customJSONDecoder ?? self.defaultJSONDecoder }
|
||||
set { self.customJSONDecoder = newValue }
|
||||
}
|
||||
public static var jsonEncoder: JSONEncoder {
|
||||
get { return self.customJSONEncoder ?? self.defaultJSONEncoder }
|
||||
set { self.customJSONEncoder = newValue }
|
||||
}
|
||||
|
||||
open class func decode<T>(_ type: T.Type, from data: Data) -> (decodableObj: T?, error: Error?) where T: Decodable {
|
||||
var returnedDecodable: T?
|
||||
var returnedError: Error?
|
||||
|
||||
let decoder = JSONDecoder()
|
||||
if let df = self.dateformatter {
|
||||
decoder.dateDecodingStrategy = .formatted(df)
|
||||
} else {
|
||||
decoder.dataDecodingStrategy = .base64
|
||||
let formatter = DateFormatter()
|
||||
formatter.calendar = Calendar(identifier: .iso8601)
|
||||
formatter.locale = Locale(identifier: "en_US_POSIX")
|
||||
formatter.timeZone = TimeZone(secondsFromGMT: 0)
|
||||
formatter.dateFormat = Configuration.dateFormat
|
||||
decoder.dateDecodingStrategy = .formatted(formatter)
|
||||
}
|
||||
|
||||
do {
|
||||
returnedDecodable = try decoder.decode(type, from: data)
|
||||
returnedDecodable = try self.jsonDecoder.decode(type, from: data)
|
||||
} catch {
|
||||
returnedError = error
|
||||
}
|
||||
@@ -39,33 +60,16 @@ open class CodableHelper {
|
||||
return (returnedDecodable, returnedError)
|
||||
}
|
||||
|
||||
open class func encode<T>(_ value: T, prettyPrint: Bool = false) -> EncodeResult where T: Encodable {
|
||||
open class func encode<T>(_ value: T) -> EncodeResult where T: Encodable {
|
||||
var returnedData: Data?
|
||||
var returnedError: Error?
|
||||
|
||||
let encoder = JSONEncoder()
|
||||
if prettyPrint {
|
||||
encoder.outputFormatting = .prettyPrinted
|
||||
}
|
||||
if let df = self.dateformatter {
|
||||
encoder.dateEncodingStrategy = .formatted(df)
|
||||
} else {
|
||||
encoder.dataEncodingStrategy = .base64
|
||||
let formatter = DateFormatter()
|
||||
formatter.calendar = Calendar(identifier: .iso8601)
|
||||
formatter.locale = Locale(identifier: "en_US_POSIX")
|
||||
formatter.timeZone = TimeZone(secondsFromGMT: 0)
|
||||
formatter.dateFormat = Configuration.dateFormat
|
||||
encoder.dateEncodingStrategy = .formatted(formatter)
|
||||
}
|
||||
|
||||
do {
|
||||
returnedData = try encoder.encode(value)
|
||||
returnedData = try self.jsonEncoder.encode(value)
|
||||
} catch {
|
||||
returnedError = error
|
||||
}
|
||||
|
||||
return (returnedData, returnedError)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -34,6 +34,10 @@ extension String: JSONEncodable {
|
||||
func encodeToJSON() -> Any { return self as Any }
|
||||
}
|
||||
|
||||
extension RawRepresentable where RawValue: JSONEncodable {
|
||||
func encodeToJSON() -> Any { return self.rawValue as Any }
|
||||
}
|
||||
|
||||
private func encodeIfPossible<T>(_ object: T) -> Any {
|
||||
if let encodableObject = object as? JSONEncodable {
|
||||
return encodableObject.encodeToJSON()
|
||||
@@ -64,22 +68,15 @@ extension Data: JSONEncodable {
|
||||
}
|
||||
}
|
||||
|
||||
private let dateFormatter: DateFormatter = {
|
||||
if let formatter = CodableHelper.dateformatter {
|
||||
return formatter
|
||||
} else {
|
||||
let formatter = DateFormatter()
|
||||
formatter.calendar = Calendar(identifier: .iso8601)
|
||||
formatter.locale = Locale(identifier: "en_US_POSIX")
|
||||
formatter.timeZone = TimeZone(secondsFromGMT: 0)
|
||||
formatter.dateFormat = Configuration.dateFormat
|
||||
return formatter
|
||||
}
|
||||
}()
|
||||
|
||||
extension Date: JSONEncodable {
|
||||
func encodeToJSON() -> Any {
|
||||
return dateFormatter.string(from: self) as Any
|
||||
return CodableHelper.dateFormatter.string(from: self) as Any
|
||||
}
|
||||
}
|
||||
|
||||
extension URL: JSONEncodable {
|
||||
func encodeToJSON() -> Any {
|
||||
return self
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ open class JSONEncodingHelper {
|
||||
|
||||
// Encode the Encodable object
|
||||
if let encodableObj = encodableObj {
|
||||
let encodeResult = CodableHelper.encode(encodableObj, prettyPrint: true)
|
||||
let encodeResult = CodableHelper.encode(encodableObj)
|
||||
if encodeResult.error == nil {
|
||||
params = JSONDataEncoding.encodingParameters(jsonData: encodeResult.data)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user