Skip to content

Commit a4ea9ab

Browse files
committed
Comments, Runtime -> JMESRuntime, Error renaming
1 parent 7fa8b3c commit a4ea9ab

File tree

11 files changed

+172
-109
lines changed

11 files changed

+172
-109
lines changed

Sources/JMESPath/Ast.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public enum Comparator: Equatable {
4343
case .greaterThan: self = .greaterThan
4444
case .greaterThanOrEqual: self = .greaterThanOrEqual
4545
default:
46-
throw JMESPathError.syntaxError("Failed to parse comparison symbol")
46+
throw JMESPathError.compileTime("Failed to parse comparison symbol")
4747
}
4848
}
4949
}

Sources/JMESPath/Error.swift

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,14 @@
1+
/// JMESPath error type.
2+
///
3+
/// Provides two errors, compile time and run time errors
14
public struct JMESPathError: Error, Equatable {
2-
public static func syntaxError(_ message: String) -> Self { .init(value: .syntaxError(message))}
3-
public static func invalidArguments(_ message: String) -> Self { .init(value: .invalidArguments(message))}
4-
public static func invalidType(_ message: String) -> Self { .init(value: .invalidType(message))}
5-
public static func invalidValue(_ message: String) -> Self { .init(value: .invalidValue(message))}
6-
public static func unknownFunction(_ message: String) -> Self { .init(value: .unknownFunction(message))}
5+
/// Error that occurred while compiling JMESPath
6+
public static func compileTime(_ message: String) -> Self { .init(value: .compileTime(message))}
7+
/// Error that occurred while running a search
78
public static func runtime(_ message: String) -> Self { .init(value: .runtime(message))}
89

910
private enum Internal: Equatable {
10-
case syntaxError(String)
11-
case invalidArguments(String)
12-
case invalidType(String)
13-
case invalidValue(String)
14-
case unknownFunction(String)
11+
case compileTime(String)
1512
case runtime(String)
1613
}
1714

Sources/JMESPath/Expression.swift

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import Foundation
22

33
/// JMES Expression
44
///
5-
/// Holds a compiled JMES expression and allows you to search Json text or a structure already in memory
5+
/// Holds a compiled JMES expression and allows you to search Json text or a type already in memory
66
public struct Expression {
77
let ast: Ast
88

@@ -14,21 +14,51 @@ public struct Expression {
1414
return self.init(ast)
1515
}
1616

17-
public func search(_ any: Any, runtime: Runtime = .init()) throws -> Any? {
18-
return try runtime.interpret(JMESVariable(from: any), ast: self.ast).collapse()
17+
/// Search JSON
18+
///
19+
/// - Parameters:
20+
/// - any: JSON to search
21+
/// - as: Swift type to return
22+
/// - runtime: JMES runtime (includes functions)
23+
/// - Throws: JMESPathError
24+
/// - Returns: Search result
25+
public func search<Value>(json: String, as: Value.Type = Value.self, runtime: JMESRuntime = .init()) throws -> Value? {
26+
return try search(json: json, runtime: runtime) as? Value
1927
}
2028

21-
public func search(json: String, runtime: Runtime = .init()) throws -> Any? {
22-
let value = try JMESVariable.fromJson(json)
23-
return try runtime.interpret(value, ast: self.ast).collapse()
29+
/// Search Swift type
30+
///
31+
/// - Parameters:
32+
/// - any: Swift type to search
33+
/// - as: Swift type to return
34+
/// - runtime: JMES runtime (includes functions)
35+
/// - Throws: JMESPathError
36+
/// - Returns: Search result
37+
public func search<Value>(_ any: Any, as: Value.Type = Value.self, runtime: JMESRuntime = .init()) throws -> Value? {
38+
return try search(any, runtime: runtime) as? Value
2439
}
2540

26-
public func search<Value>(_ any: Any, as: Value.Type = Value.self, runtime: Runtime = .init()) throws -> Value? {
27-
return try search(any, runtime: runtime) as? Value
41+
/// Search JSON
42+
///
43+
/// - Parameters:
44+
/// - any: JSON to search
45+
/// - runtime: JMES runtime (includes functions)
46+
/// - Throws: JMESPathError
47+
/// - Returns: Search result
48+
public func search(json: String, runtime: JMESRuntime = .init()) throws -> Any? {
49+
let value = try JMESVariable.fromJson(json)
50+
return try runtime.interpret(value, ast: self.ast).collapse()
2851
}
2952

30-
public func search<Value>(json: String, as: Value.Type = Value.self, runtime: Runtime = .init()) throws -> Value? {
31-
return try search(json: json, runtime: runtime) as? Value
53+
/// Search Swift type
54+
///
55+
/// - Parameters:
56+
/// - any: Swift type to search
57+
/// - runtime: JMES runtime (includes functions)
58+
/// - Throws: JMESPathError
59+
/// - Returns: Search result
60+
public func search(_ any: Any, runtime: JMESRuntime = .init()) throws -> Any? {
61+
return try runtime.interpret(JMESVariable(from: any), ast: self.ast).collapse()
3262
}
3363

3464
private init(_ ast: Ast) {

Sources/JMESPath/Functions.swift

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import Foundation
22

3+
/// Function argument used in function signature to verify arguments
34
public indirect enum FunctionArgumentType {
45
case any
56
case null
@@ -14,6 +15,7 @@ public indirect enum FunctionArgumentType {
1415
}
1516

1617
extension JMESVariable {
18+
/// Is variable of a certain argument type
1719
func isType(_ type: FunctionArgumentType) -> Bool {
1820
switch (self, type) {
1921
case (_, .any),
@@ -40,6 +42,7 @@ extension JMESVariable {
4042
}
4143
}
4244

45+
/// Used to validate arguments of a function before it is run
4346
public struct FunctionSignature {
4447
let inputs: [FunctionArgumentType]
4548
let varArg: FunctionArgumentType?
@@ -70,9 +73,12 @@ public struct FunctionSignature {
7073
}
7174
}
7275

76+
/// Protocol for JMESPath function expression
7377
public protocol Function {
78+
/// function signature
7479
static var signature: FunctionSignature { get }
75-
static func evaluate(args: [JMESVariable], runtime: Runtime) throws -> JMESVariable
80+
/// Evaluate function
81+
static func evaluate(args: [JMESVariable], runtime: JMESRuntime) throws -> JMESVariable
7682
}
7783

7884
protocol NumberFunction: Function {
@@ -81,7 +87,7 @@ protocol NumberFunction: Function {
8187

8288
extension NumberFunction {
8389
static var signature: FunctionSignature { .init(inputs: .number) }
84-
static func evaluate(args: [JMESVariable], runtime: Runtime) -> JMESVariable {
90+
static func evaluate(args: [JMESVariable], runtime: JMESRuntime) -> JMESVariable {
8591
switch args[0] {
8692
case .number(let number):
8793
return self.evaluate(number)
@@ -97,7 +103,7 @@ protocol ArrayFunction: Function {
97103

98104
extension ArrayFunction {
99105
static var signature: FunctionSignature { .init(inputs: .array) }
100-
static func evaluate(args: [JMESVariable], runtime: Runtime) -> JMESVariable {
106+
static func evaluate(args: [JMESVariable], runtime: JMESRuntime) -> JMESVariable {
101107
switch args[0] {
102108
case .array(let array):
103109
return self.evaluate(array)
@@ -136,7 +142,7 @@ struct CeilFunction: NumberFunction {
136142

137143
struct ContainsFunction: Function {
138144
static var signature: FunctionSignature { .init(inputs: .union([.array, .string]), .any) }
139-
static func evaluate(args: [JMESVariable], runtime: Runtime) -> JMESVariable {
145+
static func evaluate(args: [JMESVariable], runtime: JMESRuntime) -> JMESVariable {
140146
switch (args[0], args[1]) {
141147
case (.array(let array), _):
142148
let result = array.firstIndex(of: args[1]) != nil
@@ -157,7 +163,7 @@ struct ContainsFunction: Function {
157163

158164
struct EndsWithFunction: Function {
159165
static var signature: FunctionSignature { .init(inputs: .string, .string) }
160-
static func evaluate(args: [JMESVariable], runtime: Runtime) -> JMESVariable {
166+
static func evaluate(args: [JMESVariable], runtime: JMESRuntime) -> JMESVariable {
161167
switch (args[0], args[1]) {
162168
case (.string(let string), .string(let string2)):
163169
return .boolean(string.hasSuffix(string2))
@@ -175,7 +181,7 @@ struct FloorFunction: NumberFunction {
175181

176182
struct JoinFunction: Function {
177183
static var signature: FunctionSignature { .init(inputs: .string, .typedArray(.string)) }
178-
static func evaluate(args: [JMESVariable], runtime: Runtime) -> JMESVariable {
184+
static func evaluate(args: [JMESVariable], runtime: JMESRuntime) -> JMESVariable {
179185
switch (args[0], args[1]) {
180186
case (.string(let separator), .array(let array)):
181187
let strings: [String] = array.map {
@@ -194,7 +200,7 @@ struct JoinFunction: Function {
194200

195201
struct KeysFunction: Function {
196202
static var signature: FunctionSignature { .init(inputs: .object) }
197-
static func evaluate(args: [JMESVariable], runtime: Runtime) -> JMESVariable {
203+
static func evaluate(args: [JMESVariable], runtime: JMESRuntime) -> JMESVariable {
198204
switch args[0] {
199205
case .object(let object):
200206
return .array(object.map { .string($0.key) })
@@ -206,7 +212,7 @@ struct KeysFunction: Function {
206212

207213
struct LengthFunction: Function {
208214
static var signature: FunctionSignature { .init(inputs: .union([.array, .object, .string])) }
209-
static func evaluate(args: [JMESVariable], runtime: Runtime) -> JMESVariable {
215+
static func evaluate(args: [JMESVariable], runtime: JMESRuntime) -> JMESVariable {
210216
switch args[0] {
211217
case .array(let array):
212218
return .number(.init(value: array.count))
@@ -222,7 +228,7 @@ struct LengthFunction: Function {
222228

223229
struct MapFunction: Function {
224230
static var signature: FunctionSignature { .init(inputs: .expRef, .array) }
225-
static func evaluate(args: [JMESVariable], runtime: Runtime) throws -> JMESVariable {
231+
static func evaluate(args: [JMESVariable], runtime: JMESRuntime) throws -> JMESVariable {
226232
switch (args[0], args[1]) {
227233
case (.expRef(let ast), .array(let array)):
228234
let results = try array.map { try runtime.interpret($0, ast: ast) }
@@ -235,7 +241,7 @@ struct MapFunction: Function {
235241

236242
struct MaxFunction: Function {
237243
static var signature: FunctionSignature { .init(inputs: .union([.typedArray(.string), .typedArray(.number)])) }
238-
static func evaluate(args: [JMESVariable], runtime: Runtime) -> JMESVariable {
244+
static func evaluate(args: [JMESVariable], runtime: JMESRuntime) -> JMESVariable {
239245
switch args[0] {
240246
case .array(let array):
241247
if array.count == 0 { return .null }
@@ -272,7 +278,7 @@ struct MaxFunction: Function {
272278

273279
struct MaxByFunction: Function {
274280
static var signature: FunctionSignature { .init(inputs: .array, .expRef) }
275-
static func evaluate(args: [JMESVariable], runtime: Runtime) throws -> JMESVariable {
281+
static func evaluate(args: [JMESVariable], runtime: JMESRuntime) throws -> JMESVariable {
276282
switch (args[0], args[1]) {
277283
case (.array(let array), .expRef(let ast)):
278284
if array.count == 0 { return .null }
@@ -318,7 +324,7 @@ struct MaxByFunction: Function {
318324

319325
struct MinFunction: Function {
320326
static var signature: FunctionSignature { .init(inputs: .union([.typedArray(.string), .typedArray(.number)])) }
321-
static func evaluate(args: [JMESVariable], runtime: Runtime) -> JMESVariable {
327+
static func evaluate(args: [JMESVariable], runtime: JMESRuntime) -> JMESVariable {
322328
switch args[0] {
323329
case .array(let array):
324330
if array.count == 0 { return .null }
@@ -355,7 +361,7 @@ struct MinFunction: Function {
355361

356362
struct MinByFunction: Function {
357363
static var signature: FunctionSignature { .init(inputs: .array, .expRef) }
358-
static func evaluate(args: [JMESVariable], runtime: Runtime) throws -> JMESVariable {
364+
static func evaluate(args: [JMESVariable], runtime: JMESRuntime) throws -> JMESVariable {
359365
switch (args[0], args[1]) {
360366
case (.array(let array), .expRef(let ast)):
361367
if array.count == 0 { return .null }
@@ -401,7 +407,7 @@ struct MinByFunction: Function {
401407

402408
struct MergeFunction: Function {
403409
static var signature: FunctionSignature { .init(inputs: .object, varArg: .object) }
404-
static func evaluate(args: [JMESVariable], runtime: Runtime) -> JMESVariable {
410+
static func evaluate(args: [JMESVariable], runtime: JMESRuntime) -> JMESVariable {
405411
switch args[0] {
406412
case .object(var object):
407413
for arg in args.dropFirst() {
@@ -420,7 +426,7 @@ struct MergeFunction: Function {
420426

421427
struct NotNullFunction: Function {
422428
static var signature: FunctionSignature { .init(inputs: .any, varArg: .any) }
423-
static func evaluate(args: [JMESVariable], runtime: Runtime) -> JMESVariable {
429+
static func evaluate(args: [JMESVariable], runtime: JMESRuntime) -> JMESVariable {
424430
for arg in args {
425431
guard case .null = arg else {
426432
return arg
@@ -432,7 +438,7 @@ struct NotNullFunction: Function {
432438

433439
struct ReverseFunction: Function {
434440
static var signature: FunctionSignature { .init(inputs: .union([.array, .string])) }
435-
static func evaluate(args: [JMESVariable], runtime: Runtime) -> JMESVariable {
441+
static func evaluate(args: [JMESVariable], runtime: JMESRuntime) -> JMESVariable {
436442
switch args[0] {
437443
case .string(let string):
438444
return .string(String(string.reversed()))
@@ -446,7 +452,7 @@ struct ReverseFunction: Function {
446452

447453
struct SortFunction: Function {
448454
static var signature: FunctionSignature { .init(inputs: .union([.typedArray(.number), .typedArray(.string)])) }
449-
static func evaluate(args: [JMESVariable], runtime: Runtime) -> JMESVariable {
455+
static func evaluate(args: [JMESVariable], runtime: JMESRuntime) -> JMESVariable {
450456
switch args[0] {
451457
case .array(let array):
452458
return .array(array.sorted { $0.compare(.lessThan, value: $1) == true })
@@ -458,7 +464,7 @@ struct SortFunction: Function {
458464

459465
struct SortByFunction: Function {
460466
static var signature: FunctionSignature { .init(inputs: .array, .expRef) }
461-
static func evaluate(args: [JMESVariable], runtime: Runtime) throws -> JMESVariable {
467+
static func evaluate(args: [JMESVariable], runtime: JMESRuntime) throws -> JMESVariable {
462468
struct ValueAndSortKey {
463469
let value: JMESVariable
464470
let sortValue: JMESVariable
@@ -492,7 +498,7 @@ struct SortByFunction: Function {
492498

493499
struct StartsWithFunction: Function {
494500
static var signature: FunctionSignature { .init(inputs: .string, .string) }
495-
static func evaluate(args: [JMESVariable], runtime: Runtime) -> JMESVariable {
501+
static func evaluate(args: [JMESVariable], runtime: JMESRuntime) -> JMESVariable {
496502
switch (args[0], args[1]) {
497503
case (.string(let string), .string(let string2)):
498504
return .boolean(string.hasPrefix(string2))
@@ -518,7 +524,7 @@ struct SumFunction: ArrayFunction {
518524

519525
struct ToArrayFunction: Function {
520526
static var signature: FunctionSignature { .init(inputs: .any) }
521-
static func evaluate(args: [JMESVariable], runtime: Runtime) -> JMESVariable {
527+
static func evaluate(args: [JMESVariable], runtime: JMESRuntime) -> JMESVariable {
522528
switch args[0] {
523529
case .array(let array):
524530
return .array(array)
@@ -530,7 +536,7 @@ struct ToArrayFunction: Function {
530536

531537
struct ToNumberFunction: Function {
532538
static var signature: FunctionSignature { .init(inputs: .any) }
533-
static func evaluate(args: [JMESVariable], runtime: Runtime) throws -> JMESVariable {
539+
static func evaluate(args: [JMESVariable], runtime: JMESRuntime) throws -> JMESVariable {
534540
switch args[0] {
535541
case .number(let number):
536542
return .number(number)
@@ -548,7 +554,7 @@ struct ToNumberFunction: Function {
548554

549555
struct ToStringFunction: Function {
550556
static var signature: FunctionSignature { .init(inputs: .any) }
551-
static func evaluate(args: [JMESVariable], runtime: Runtime) throws -> JMESVariable {
557+
static func evaluate(args: [JMESVariable], runtime: JMESRuntime) throws -> JMESVariable {
552558
switch args[0] {
553559
case .string(let string):
554560
return .string(string)
@@ -560,14 +566,14 @@ struct ToStringFunction: Function {
560566

561567
struct TypeFunction: Function {
562568
static var signature: FunctionSignature { .init(inputs: .any) }
563-
static func evaluate(args: [JMESVariable], runtime: Runtime) throws -> JMESVariable {
569+
static func evaluate(args: [JMESVariable], runtime: JMESRuntime) throws -> JMESVariable {
564570
return .string(args[0].getType())
565571
}
566572
}
567573

568574
struct ValuesFunction: Function {
569575
static var signature: FunctionSignature { .init(inputs: .object) }
570-
static func evaluate(args: [JMESVariable], runtime: Runtime) -> JMESVariable {
576+
static func evaluate(args: [JMESVariable], runtime: JMESRuntime) -> JMESVariable {
571577
switch args[0] {
572578
case .object(let object):
573579
return .array(object.map { $0.value })

Sources/JMESPath/Interpreter.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11

2-
extension Runtime {
2+
extension JMESRuntime {
33
func interpret(_ data: JMESVariable, ast: Ast) throws -> JMESVariable {
44
switch ast {
55
case .field(let name):

Sources/JMESPath/Runtime.swift renamed to Sources/JMESPath/JMESRuntime.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
2-
public class Runtime {
1+
/// JMESPath runtime
2+
///
3+
/// Holds list of functions available to JMESPath expression
4+
public class JMESRuntime {
35
public init() {
46
self.functions = [:]
57
self.registerBuiltInFunctions()

0 commit comments

Comments
 (0)