@@ -23,6 +23,11 @@ public enum Delta<Element> {
23
23
public typealias Element = Element
24
24
public typealias Side = DeltaSide
25
25
26
+ enum CodingKeys : String , CodingKey {
27
+ case source = " A "
28
+ case target = " B "
29
+ }
30
+
26
31
/// A source element.
27
32
///
28
33
/// Conceptually, this is a value that was deleted and thus no target element is available.
@@ -238,8 +243,47 @@ public enum Delta<Element> {
238
243
}
239
244
240
245
extension Delta : Equatable where Element: Equatable { }
246
+
241
247
extension Delta : Hashable where Element: Hashable { }
242
- extension Delta : Encodable where Element: Encodable { }
243
- extension Delta : Decodable where Element: Decodable { }
248
+
249
+ extension Delta : Encodable where Element: Encodable {
250
+ public func encode( to encoder: any Encoder ) throws {
251
+ switch self {
252
+ case . deleted( let source) :
253
+ var container = encoder. container ( keyedBy: CodingKeys . self)
254
+ try container. encode ( source, forKey: . source)
255
+ case . added( let target) :
256
+ var container = encoder. container ( keyedBy: CodingKeys . self)
257
+ try container. encode ( target, forKey: . target)
258
+ case . modified( let source, let target) :
259
+ var container = encoder. container ( keyedBy: CodingKeys . self)
260
+ try container. encode ( source, forKey: . source)
261
+ try container. encode ( target, forKey: . target)
262
+ }
263
+ }
264
+ }
265
+
266
+ extension Delta : Decodable where Element: Decodable {
267
+ public init ( from decoder: any Decoder ) throws {
268
+ let container = try decoder. container ( keyedBy: CodingKeys . self)
269
+ let source = try container. decodeIfPresent ( Element . self, forKey: . source)
270
+ let target = try container. decodeIfPresent ( Element . self, forKey: . target)
271
+
272
+ if let source, let target {
273
+ self = . modified( source: source, target: target)
274
+ }
275
+ else if let source {
276
+ self = . deleted( source: source)
277
+ }
278
+ else if let target {
279
+ self = . added( target: target)
280
+ }
281
+ else {
282
+ throw DecodingError . dataCorrupted ( DecodingError . Context ( codingPath: decoder. codingPath, debugDescription: " No source or target value. " ) )
283
+ }
284
+ }
285
+ }
286
+
244
287
extension Delta : Sendable where Element: Sendable { }
288
+
245
289
extension Delta : BitwiseCopyable where Element: BitwiseCopyable { }
0 commit comments