// // 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 }