Skip to content

Commit 4a166ea

Browse files
authored
Merge pull request #3 from adam-fowler/jmes-property-wrapper
Add JMESPropertyWrapper protocol
2 parents 64366a8 + 9afac9e commit 4a166ea

File tree

2 files changed

+31
-2
lines changed

2 files changed

+31
-2
lines changed

Sources/JMESPath/Variable.swift

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ import Foundation
44
public typealias JMESArray = [Any]
55
public typealias JMESObject = [String: Any]
66

7+
public protocol JMESPropertyWrapper {
8+
var anyValue: Any { get }
9+
}
10+
711
/// Internal representation of a variable
812
public enum JMESVariable {
913
case null
@@ -60,11 +64,15 @@ public enum JMESVariable {
6064
default:
6165
var object: JMESObject = [:]
6266
for child in mirror.children {
63-
guard let label = child.label else {
67+
guard var label = child.label else {
6468
self = .null
6569
return
6670
}
67-
let unwrapValue = Self.unwrap(child.value) ?? NSNull()
71+
var unwrapValue = Self.unwrap(child.value) ?? NSNull()
72+
if let wrapper = unwrapValue as? JMESPropertyWrapper, label.first == "_" {
73+
label = String(label.dropFirst())
74+
unwrapValue = Self.unwrap(wrapper.anyValue) ?? NSNull()
75+
}
6876
object[label] = unwrapValue
6977
}
7078
self = .object(object)

Tests/JMESPathTests/MirrorTests.swift

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,4 +93,25 @@ final class MirrorTests: XCTestCase {
9393
let test = TestObject(d: ["test": "one", "test2": "two", "test3": "three"])
9494
self.testInterpreter("test2", data: test, result: "two")
9595
}
96+
97+
func testPropertyWrapper() {
98+
@propertyWrapper struct Wrap<T>: JMESPropertyWrapper {
99+
var value: T
100+
var customMirror: Mirror { return Mirror(reflecting: self.value) }
101+
102+
init(wrappedValue: T) {
103+
self.value = wrappedValue
104+
}
105+
var wrappedValue: T {
106+
get { return value }
107+
set { value = newValue }
108+
}
109+
var anyValue: Any { return value }
110+
}
111+
struct TestObject {
112+
@Wrap var test: String
113+
}
114+
let test = TestObject(test: "testText")
115+
self.testInterpreter("test", data: test, result: "testText")
116+
}
96117
}

0 commit comments

Comments
 (0)