amplify-swift/AmplifyTestCommon/Models/NonModel/DynamicModel.swift

79 lines
2.1 KiB
Swift

//
// Copyright Amazon.com Inc. or its affiliates.
// All Rights Reserved.
//
// SPDX-License-Identifier: Apache-2.0
//
import Amplify
import Foundation
struct DynamicModel: Model, JSONValueHolder {
public let id: String
public let values: [String: JSONValue]
public init(id: String = UUID().uuidString, map: [String: JSONValue]) {
self.id = id
self.values = map
}
public init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
id = try container.decode(String.self, forKey: .id)
let json = try JSONValue(from: decoder)
if case .object(let jsonValues) = json {
values = jsonValues
} else {
self.values = [:]
}
}
public func encode(to encoder: Encoder) throws {
var unkeyedContainer = encoder.unkeyedContainer()
try unkeyedContainer.encode(values)
}
public func jsonValue(for key: String) -> Any?? {
if key == "id" {
return id
}
switch values[key] {
case .some(.array(let deserializedValue)):
return deserializedValue
case .some(.boolean(let deserializedValue)):
return deserializedValue
case .some(.number(let deserializedValue)):
return deserializedValue
case .some(.object(let deserializedValue)):
return deserializedValue
case .some(.string(let deserializedValue)):
return deserializedValue
case .some(.null):
return nil
case .none:
return nil
}
}
public func jsonValue(for key: String, modelSchema: ModelSchema) -> Any?? {
let field = modelSchema.field(withName: key)
if case .int = field?.type,
case .some(.number(let deserializedValue)) = values[key] {
return Int(deserializedValue)
}
return jsonValue(for: key)
}
}
extension DynamicModel {
public enum CodingKeys: String, ModelKey {
case id
case values
}
public static let keys = CodingKeys.self
}