94 lines
2.9 KiB
Swift
94 lines
2.9 KiB
Swift
//
|
|
// CodableHelper.swift
|
|
//
|
|
// Generated by swagger-codegen
|
|
// https://github.com/swagger-api/swagger-codegen
|
|
//
|
|
|
|
import Foundation
|
|
|
|
public typealias EncodeResult = (data: Data?, error: Error?)
|
|
|
|
enum DateError: String, Error {
|
|
case invalidDate
|
|
}
|
|
|
|
open class CodableHelper {
|
|
|
|
public static var dateformatter: DateFormatter?
|
|
|
|
open class func decode<T>(_ type: T.Type, from data: Data) -> (decodableObj: T?, error: Error?) where T : Decodable {
|
|
var returnedDecodable: T? = nil
|
|
var returnedError: Error? = nil
|
|
|
|
let decoder = JSONDecoder()
|
|
|
|
if let df = self.dateformatter {
|
|
decoder.dateDecodingStrategy = .formatted(df)
|
|
} else {
|
|
decoder.dataDecodingStrategy = .base64
|
|
decoder.dateDecodingStrategy = .custom({ (decoder) -> Date in
|
|
let container = try decoder.singleValueContainer()
|
|
let dateStr = try container.decode(String.self)
|
|
|
|
let formatters = [
|
|
"yyyy-MM-dd",
|
|
"yyyy-MM-dd'T'HH:mm:ssZZZZZ",
|
|
"yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ",
|
|
"yyyy-MM-dd'T'HH:mm:ss'Z'",
|
|
"yyyy-MM-dd'T'HH:mm:ss.SSS",
|
|
"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'",
|
|
"yyyy-MM-dd HH:mm:ss"
|
|
].map { (format: String) -> DateFormatter in
|
|
let formatter = DateFormatter()
|
|
formatter.locale = Locale(identifier: "en_US_POSIX")
|
|
formatter.dateFormat = format
|
|
return formatter
|
|
}
|
|
|
|
for formatter in formatters {
|
|
|
|
if let date = formatter.date(from: dateStr) {
|
|
return date
|
|
}
|
|
}
|
|
|
|
throw DateError.invalidDate
|
|
})
|
|
}
|
|
|
|
do {
|
|
returnedDecodable = try decoder.decode(type, from: data)
|
|
} catch {
|
|
returnedError = error
|
|
}
|
|
|
|
return (returnedDecodable, returnedError)
|
|
}
|
|
|
|
open class func encode<T>(_ value: T, prettyPrint: Bool = false) -> EncodeResult where T : Encodable {
|
|
var returnedData: Data?
|
|
var returnedError: Error? = nil
|
|
|
|
let encoder = JSONEncoder()
|
|
if prettyPrint {
|
|
encoder.outputFormatting = .prettyPrinted
|
|
}
|
|
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 = "yyyy-MM-dd'T'HH:mm:ss.SSSXXXXX"
|
|
encoder.dateEncodingStrategy = .formatted(formatter)
|
|
|
|
do {
|
|
returnedData = try encoder.encode(value)
|
|
} catch {
|
|
returnedError = error
|
|
}
|
|
|
|
return (returnedData, returnedError)
|
|
}
|
|
}
|