import Foundation import VGSL extension SettingProperty where T: Serializable & Deserializable { @usableFromInline static func serializableStorage( _ storage: KeyValueStorage, key: String ) -> Property { let field = SettingProperty<[String: Any]>.storage(storage, key: key) return Property(getter: { guard let val = field.value else { return nil } return try? T(dictionary: val) }, setter: { newValue in field.value = newValue?.toDictionary() }) } } extension KeyValueStorage { @inlinable public func makeField(key: String) -> Property where T: Serializable, T: Deserializable { SettingProperty.serializableStorage(self, key: key) } @inlinable public func makeField(key: String, default: T) -> Property where T: Serializable, T: Deserializable { SettingProperty.serializableStorage(self, key: key).withDefault(`default`) } }