17
17
import Foundation
18
18
19
19
enum AttributeValue : Codable , Equatable , CustomStringConvertible {
20
+ typealias AttrArray = Array < AttributeValue >
21
+ typealias AttrDictionary = [ String : AttributeValue ]
22
+
20
23
case string( String )
21
24
case int( Int64 ) // supported value range [-2^53, 2^53]
22
25
case double( Double )
23
26
case bool( Bool )
24
- case custom( [ String : AttributeValue ] )
27
+ case array( AttrArray )
28
+ case dictionary( AttrDictionary )
25
29
case others
26
30
27
31
var description : String {
@@ -34,8 +38,10 @@ enum AttributeValue: Codable, Equatable, CustomStringConvertible {
34
38
return " int( \( value) ) "
35
39
case . bool( let value) :
36
40
return " bool( \( value) ) "
37
- case . custom( let value) :
38
- return " custom( \( value) ) "
41
+ case . array( let value) :
42
+ return " array( \( value) ) "
43
+ case . dictionary( let value) :
44
+ return " dictionary( \( value) ) "
39
45
case . others:
40
46
return " others "
41
47
}
@@ -66,9 +72,15 @@ enum AttributeValue: Codable, Equatable, CustomStringConvertible {
66
72
return
67
73
}
68
74
69
- if let custom = value as? [ String : Any ] {
70
- let attr = custom. compactMapValues { AttributeValue ( value: $0) }
71
- self = . custom( attr)
75
+ if let arrValue = value as? [ Any ] {
76
+ let attr = arrValue. compactMap { AttributeValue ( value: $0) }
77
+ self = . array( attr)
78
+ return
79
+ }
80
+
81
+ if let dicValue = value as? [ String : Any ] {
82
+ let attr = dicValue. compactMapValues { AttributeValue ( value: $0) }
83
+ self = . dictionary( attr)
72
84
return
73
85
}
74
86
@@ -95,8 +107,13 @@ enum AttributeValue: Codable, Equatable, CustomStringConvertible {
95
107
return
96
108
}
97
109
98
- if let value = try ? container. decode ( [ String : AttributeValue ] . self) {
99
- self = . custom( value)
110
+ if let value = try ? container. decode ( AttrArray . self) {
111
+ self = . array( value)
112
+ return
113
+ }
114
+
115
+ if let value = try ? container. decode ( AttrDictionary . self) {
116
+ self = . dictionary( value)
100
117
return
101
118
}
102
119
@@ -117,7 +134,9 @@ enum AttributeValue: Codable, Equatable, CustomStringConvertible {
117
134
try container. encode ( value)
118
135
case . bool( let value) :
119
136
try container. encode ( value)
120
- case . custom( let value) :
137
+ case . array( let value) :
138
+ try container. encode ( value)
139
+ case . dictionary( let value) :
121
140
try container. encode ( value. mapValues { $0 } )
122
141
case . others:
123
142
return
@@ -151,7 +170,11 @@ extension AttributeValue {
151
170
return true
152
171
}
153
172
154
- if case . custom( let selfDict) = self , case . custom( let targetDict) = targetValue {
173
+ if case . array( let selfArr) = self , case . array( let targetArr) = targetValue {
174
+ return selfArr == targetArr
175
+ }
176
+
177
+ if case . dictionary( let selfDict) = self , case . dictionary( let targetDict) = targetValue {
155
178
return selfDict == targetDict
156
179
}
157
180
@@ -247,7 +270,9 @@ extension AttributeValue {
247
270
return String ( value)
248
271
case . bool( let value) :
249
272
return String ( value)
250
- case . custom( let value) :
273
+ case . array( let value) :
274
+ return String ( describing: value)
275
+ case . dictionary( let value) :
251
276
return String ( describing: value)
252
277
case . others:
253
278
return " UNKNOWN "
@@ -262,7 +287,8 @@ extension AttributeValue {
262
287
case ( . double, . int) : return true
263
288
case ( . double, . double) : return true
264
289
case ( . bool, . bool) : return true
265
- case ( . custom, . custom) : return true
290
+ case ( . array, . array) : return true
291
+ case ( . dictionary, . dictionary) : return true
266
292
default : return false
267
293
}
268
294
}
@@ -294,6 +320,7 @@ extension AttributeValue {
294
320
case ( . int) : return true
295
321
case ( . double) : return true
296
322
case ( . bool) : return true
323
+ case ( . array) : return true
297
324
default : return false
298
325
}
299
326
}
0 commit comments