// Models.swift // // Generated by swagger-codegen // https://github.com/swagger-api/swagger-codegen // import Foundation protocol JSONEncodable { func encodeToJSON() -> Any } public enum ErrorResponse : Error { case Error(Int, Data?, Error) } open class Response { open let statusCode: Int open let header: [String: String] open let body: T? public init(statusCode: Int, header: [String: String], body: T?) { self.statusCode = statusCode self.header = header self.body = body } public convenience init(response: HTTPURLResponse, body: T?) { let rawHeader = response.allHeaderFields var header = [String:String]() for (key, value) in rawHeader { header[key as! String] = value as? String } self.init(statusCode: response.statusCode, header: header, body: body) } } private var once = Int() class Decoders { static fileprivate var decoders = Dictionary AnyObject)>() static func addDecoder(clazz: T.Type, decoder: @escaping ((AnyObject) -> T)) { let key = "\(T.self)" decoders[key] = { decoder($0) as AnyObject } } static func decode(clazz: [T].Type, source: AnyObject) -> [T] { let array = source as! [AnyObject] return array.map { Decoders.decode(clazz: T.self, source: $0) } } static func decode(clazz: [Key:T].Type, source: AnyObject) -> [Key:T] { let sourceDictionary = source as! [Key: AnyObject] var dictionary = [Key:T]() for (key, value) in sourceDictionary { dictionary[key] = Decoders.decode(clazz: T.self, source: value) } return dictionary } static func decode(clazz: T.Type, source: AnyObject) -> T { initialize() if T.self is Int32.Type && source is NSNumber { return source.int32Value as! T; } if T.self is Int64.Type && source is NSNumber { return source.int64Value as! T; } if T.self is UUID.Type && source is String { return UUID(uuidString: source as! String) as! T } if source is T { return source as! T } if T.self is Data.Type && source is String { return Data(base64Encoded: source as! String) as! T } let key = "\(T.self)" if let decoder = decoders[key] { return decoder(source) as! T } else { fatalError("Source \(source) is not convertible to type \(clazz): Maybe swagger file is insufficient") } } static func decodeOptional(clazz: T.Type, source: AnyObject?) -> T? { if source is NSNull { return nil } return source.map { (source: AnyObject) -> T in Decoders.decode(clazz: clazz, source: source) } } static func decodeOptional(clazz: [T].Type, source: AnyObject?) -> [T]? { if source is NSNull { return nil } return source.map { (someSource: AnyObject) -> [T] in Decoders.decode(clazz: clazz, source: someSource) } } static func decodeOptional(clazz: [Key:T].Type, source: AnyObject?) -> [Key:T]? { if source is NSNull { return nil } return source.map { (someSource: AnyObject) -> [Key:T] in Decoders.decode(clazz: clazz, source: someSource) } } private static var __once: () = { 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" ].map { (format: String) -> DateFormatter in let formatter = DateFormatter() formatter.dateFormat = format return formatter } // Decoder for Date Decoders.addDecoder(clazz: Date.self) { (source: AnyObject) -> Date in if let sourceString = source as? String { for formatter in formatters { if let date = formatter.date(from: sourceString) { return date } } } if let sourceInt = source as? Int { // treat as a java date return Date(timeIntervalSince1970: Double(sourceInt / 1000) ) } fatalError("formatter failed to parse \(source)") } {{#models}}{{#model}} // Decoder for [{{{classname}}}] Decoders.addDecoder(clazz: [{{{classname}}}].self) { (source: AnyObject) -> [{{{classname}}}] in return Decoders.decode(clazz: [{{{classname}}}].self, source: source) } // Decoder for {{{classname}}} Decoders.addDecoder(clazz: {{{classname}}}.self) { (source: AnyObject) -> {{{classname}}} in {{#isArrayModel}} let sourceArray = source as! [AnyObject] return sourceArray.map({ Decoders.decode(clazz: {{{arrayModelType}}}.self, source: $0) }) {{/isArrayModel}} {{^isArrayModel}} {{#isEnum}} if let source = source as? {{dataType}} { if let result = {{classname}}(rawValue: source) { return result } } fatalError("Source \(source) is not convertible to enum type {{classname}}: Maybe swagger file is insufficient") {{/isEnum}} {{^isEnum}} {{#vars.isEmpty}} if let source = source as? {{dataType}} { return source } fatalError("Source \(source) is not convertible to typealias {{classname}}: Maybe swagger file is insufficient") {{/vars.isEmpty}} {{^vars.isEmpty}} let sourceDictionary = source as! [AnyHashable: Any] {{#unwrapRequired}} let instance = {{classname}}({{#requiredVars}}{{^-first}}, {{/-first}}{{#isEnum}}{{name}}: {{classname}}.{{datatypeWithEnum}}(rawValue: (sourceDictionary["{{baseName}}"] as! {{datatype}}))! {{/isEnum}}{{^isEnum}}{{name}}: Decoders.decode(clazz: {{{baseType}}}.self, source: sourceDictionary["{{baseName}}"]! as AnyObject){{/isEnum}}{{/requiredVars}}) {{#optionalVars}}{{#isEnum}} if let {{name}} = sourceDictionary["{{baseName}}"] as? {{datatype}} { {{^isContainer}} instance.{{name}} = {{classname}}.{{datatypeWithEnum}}(rawValue: ({{name}})){{/isContainer}}{{#isListContainer}} instance.{{name}} = {{name}}.map ({ {{classname}}.{{enumName}}(rawValue: $0)! }){{/isListContainer}} }{{/isEnum}}{{^isEnum}} instance.{{name}} = Decoders.decodeOptional(clazz: {{{baseType}}}.self, source: sourceDictionary["{{baseName}}"] as AnyObject?){{/isEnum}} {{/optionalVars}} {{/unwrapRequired}} {{^unwrapRequired}} let instance = {{classname}}(){{#vars}}{{#isEnum}} if let {{name}} = sourceDictionary["{{baseName}}"] as? {{datatype}} { {{^isContainer}} instance.{{name}} = {{classname}}.{{datatypeWithEnum}}(rawValue: ({{name}})){{/isContainer}}{{#isListContainer}} instance.{{name}} = {{name}}.map ({ {{classname}}.{{enumName}}(rawValue: $0)! }){{/isListContainer}}{{#isMapContainer}}//TODO: handle enum map scenario{{/isMapContainer}} }{{/isEnum}} {{^isEnum}}instance.{{name}} = Decoders.decodeOptional(clazz: {{{baseType}}}.self, source: sourceDictionary["{{baseName}}"] as AnyObject?){{/isEnum}}{{/vars}} {{/unwrapRequired}} return instance {{/vars.isEmpty}} {{/isEnum}} {{/isArrayModel}} }{{/model}} {{/models}} }() static fileprivate func initialize() { _ = Decoders.__once } }