11import Foundation
22
3+ /// Function argument used in function signature to verify arguments
34public indirect enum FunctionArgumentType {
45 case any
56 case null
@@ -14,6 +15,7 @@ public indirect enum FunctionArgumentType {
1415}
1516
1617extension 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
4346public 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
7377public 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
7884protocol NumberFunction : Function {
@@ -81,7 +87,7 @@ protocol NumberFunction: Function {
8187
8288extension 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
98104extension 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
137143struct 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
158164struct 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
176182struct 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
195201struct 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
207213struct 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
223229struct 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
236242struct 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
273279struct 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
319325struct 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
356362struct 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
402408struct 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
421427struct 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
433439struct 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
447453struct 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
459465struct 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
493499struct 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
519525struct 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
531537struct 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
549555struct 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
561567struct 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
568574struct 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 } )
0 commit comments