Skip to content

Commit 9095158

Browse files
committed
Add parsing of dictionary/collection mirrors
1 parent ddc3ae2 commit 9095158

File tree

2 files changed

+44
-12
lines changed

2 files changed

+44
-12
lines changed

Sources/JMESPath/Variable.swift

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -34,27 +34,41 @@ public enum JMESVariable {
3434
self = .array(set.map { $0 })
3535
case let dictionary as [String: Any]:
3636
self = .object(dictionary)
37+
case is NSNull:
38+
self = .null
3739
default:
38-
if any is NSNull {
39-
self = .null
40-
return
41-
}
4240
// use Mirror to build JMESVariable.object
4341
let mirror = Mirror(reflecting: any)
4442
guard mirror.children.count > 0 else {
4543
self = .other(any)
4644
return
4745
}
48-
var object: JMESObject = [:]
49-
for child in mirror.children {
50-
guard let label = child.label else {
51-
self = .null
52-
return
46+
switch mirror.displayStyle {
47+
case .collection:
48+
let array = mirror.children.map {
49+
Self.unwrap($0.value) ?? NSNull()
50+
}
51+
self = .array(array)
52+
case .dictionary:
53+
var object: JMESObject = [:]
54+
var index: Int = 0
55+
while let key = mirror.descendant(index, "key") as? String, let value = mirror.descendant(index, "value") {
56+
object[key] = Self.unwrap(value) ?? NSNull()
57+
index += 1
58+
}
59+
self = .object(object)
60+
default:
61+
var object: JMESObject = [:]
62+
for child in mirror.children {
63+
guard let label = child.label else {
64+
self = .null
65+
return
66+
}
67+
let unwrapValue = Self.unwrap(child.value) ?? NSNull()
68+
object[label] = unwrapValue
5369
}
54-
let unwrapValue = Self.unwrap(child.value) ?? NSNull()
55-
object[label] = unwrapValue
70+
self = .object(object)
5671
}
57-
self = .object(object)
5872
}
5973
}
6074

Tests/JMESPathTests/MirrorTests.swift

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,4 +75,22 @@ final class MirrorTests: XCTestCase {
7575
let test = TestObject(e: .test2)
7676
self.testInterpreter("e", data: test, result: TestEnum.test2)
7777
}
78+
79+
func testCustomReflectableArray() {
80+
struct TestObject: CustomReflectable {
81+
let a: [Int]
82+
var customMirror: Mirror { return Mirror(reflecting: a) }
83+
}
84+
let test = TestObject(a: [1,2,3,4])
85+
self.testInterpreter("[2]", data: test, result: 3)
86+
}
87+
88+
func testCustomReflectableDictionary() {
89+
struct TestObject: CustomReflectable {
90+
let d: [String: String]
91+
var customMirror: Mirror { return Mirror(reflecting: d) }
92+
}
93+
let test = TestObject(d: ["test": "one", "test2": "two", "test3": "three"])
94+
self.testInterpreter("test2", data: test, result: "two")
95+
}
7896
}

0 commit comments

Comments
 (0)