Skip to content

Commit d3e6d05

Browse files
committed
Add: Unwrap Bool, encoded Bool
1 parent 4afff6b commit d3e6d05

File tree

2 files changed

+401
-362
lines changed

2 files changed

+401
-362
lines changed

Sources/Lookup/Lookup.swift

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ fileprivate func unwrap(_ object: Any?) -> Any {
2323
case let lookupRawValue as LookupRawValue:
2424
return lookupRawValue.lookupRawValue
2525
case let number as NSNumber:
26+
if String(describing: type(of: number)) == "__NSCFBoolean" {
27+
return number.boolValue
28+
}
2629
return number
2730
case let str as String:
2831
return str
@@ -57,6 +60,7 @@ public struct Lookup: @unchecked Sendable {
5760
case object
5861
case number
5962
case string
63+
case bool
6064
}
6165

6266
public var rawValue: Any {
@@ -74,10 +78,13 @@ public struct Lookup: @unchecked Sendable {
7478
return rawNumber
7579
case .string:
7680
return rawString
81+
case .bool:
82+
return rawBool
7783
}
7884
}
7985
}
8086

87+
var rawBool: Bool = false
8188
var rawType: RawType
8289
var rawDict: [String: Any] = [:]
8390
var rawArray: [Any] = []
@@ -94,8 +101,13 @@ public struct Lookup: @unchecked Sendable {
94101
default:
95102
switch unwrap(jsonObject) {
96103
case let number as NSNumber:
97-
self.rawNumber = number
98-
self.rawType = .number
104+
if String(describing: type(of: number)) == "__NSCFBoolean" {
105+
self.rawBool = number.boolValue
106+
self.rawType = .bool
107+
} else {
108+
self.rawNumber = number
109+
self.rawType = .number
110+
}
99111

100112
case let str as String:
101113
self.rawString = str
@@ -166,6 +178,10 @@ public struct Lookup: @unchecked Sendable {
166178
switch rawType {
167179
case .none:
168180
return .null
181+
182+
case .bool:
183+
return Lookup(rawBool)
184+
169185
case .dict, .object:
170186
let value: Any = rawDict[key, default: NSNull()]
171187
let innerLookup = Lookup(value)
@@ -189,15 +205,20 @@ public struct Lookup: @unchecked Sendable {
189205
}
190206

191207
switch rawType {
208+
case .bool:
209+
return Lookup(rawBool)
210+
192211
case .dict, .object:
193212
return Lookup(rawDict[dynamicMember, default: NSNull()])
213+
194214
case .array, .string:
195215
if dynamicMember.isPurnInt,
196216
let index = Int(dynamicMember)
197217
{
198218
return self[index]
199219
}
200220
return .null
221+
201222
default:
202223
return .null
203224
}
@@ -229,7 +250,7 @@ public struct Lookup: @unchecked Sendable {
229250
switch _value.rawType {
230251
case .none, .number, .string:
231252
_value = value
232-
case .dict, .object:
253+
case .dict, .object, .bool:
233254
_value.rawDict[finalKey] = value.rawValue
234255
case .array:
235256
if inner {
@@ -250,7 +271,7 @@ public struct Lookup: @unchecked Sendable {
250271
switch rawType {
251272
case .none, .number, .string:
252273
self = value
253-
case .dict, .object:
274+
case .dict, .object, .bool:
254275
rawDict[dynamicMember] = value.rawValue
255276
case .array:
256277
if dynamicMember.isPurnInt, let index = Int(dynamicMember) {
@@ -559,10 +580,15 @@ public extension Lookup {
559580

560581
// MARK: - Bool
561582
var bool: Bool? {
562-
(string as NSString?)?.boolValue
583+
switch rawType {
584+
case .bool:
585+
rawBool
586+
default:
587+
(string as NSString?)?.boolValue
588+
}
563589
}
564590
var boolValue: Bool {
565-
(string! as NSString).boolValue
591+
self.bool!
566592
}
567593

568594
// MARK: - Dict
@@ -765,14 +791,14 @@ extension Lookup: Codable {
765791
}
766792
// try to decode value
767793
switch type {
794+
case let boolType as Bool.Type:
795+
object = try? container.decode(boolType)
768796
case let stringType as String.Type:
769797
object = try? container.decode(stringType)
770798
case let jsonValueArrayType as [Lookup].Type:
771799
object = try? container.decode(jsonValueArrayType)
772800
case let jsonValueDictType as [String: Lookup].Type:
773801
object = try? container.decode(jsonValueDictType)
774-
case let boolType as Bool.Type:
775-
object = try? container.decode(boolType)
776802
case let doubleType as Double.Type:
777803
object = try? container.decode(doubleType)
778804
case let uintType as UInt.Type:
@@ -902,6 +928,8 @@ extension Lookup: Swift.CustomStringConvertible, Swift.CustomDebugStringConverti
902928
desc = "\(rawNumber)"
903929
case .string:
904930
desc = "\(rawValue)"
931+
case .bool:
932+
desc = "\(rawBool)"
905933
case .none:
906934
desc = "nil"
907935
}
@@ -932,7 +960,7 @@ extension Lookup {
932960

933961
public func compactMapValues(keepKeyOfEmptyValue: Bool = false) -> Lookup {
934962
switch rawType {
935-
case .none, .number:
963+
case .none, .number, .bool:
936964
return self
937965
case .string:
938966
return self

0 commit comments

Comments
 (0)