feat(filters): Allow filters with arguments
This commit is contained in:
@@ -2,7 +2,7 @@ import Foundation
|
||||
|
||||
|
||||
class FilterExpression : Resolvable {
|
||||
let filters: [Filter]
|
||||
let filters: [(FilterType, [Variable])]
|
||||
let variable: Variable
|
||||
|
||||
init(token: String, parser: TokenParser) throws {
|
||||
@@ -17,7 +17,11 @@ class FilterExpression : Resolvable {
|
||||
let filterBits = bits[bits.indices.suffix(from: 1)]
|
||||
|
||||
do {
|
||||
filters = try filterBits.map { try parser.findFilter($0) }
|
||||
filters = try filterBits.map {
|
||||
let (name, arguments) = parseFilterComponents(token: $0)
|
||||
let filter = try parser.findFilter(name)
|
||||
return (filter, arguments)
|
||||
}
|
||||
} catch {
|
||||
filters = []
|
||||
throw error
|
||||
@@ -28,7 +32,8 @@ class FilterExpression : Resolvable {
|
||||
let result = try variable.resolve(context)
|
||||
|
||||
return try filters.reduce(result) { x, y in
|
||||
return try y(x)
|
||||
let arguments = try y.1.map { try $0.resolve(context) }
|
||||
return try y.0.invoke(value: x, arguments: arguments)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -135,3 +140,10 @@ extension Dictionary : Normalizable {
|
||||
return dictionary
|
||||
}
|
||||
}
|
||||
|
||||
func parseFilterComponents(token: String) -> (String, [Variable]) {
|
||||
var components = token.characters.split(separator: ":").map(String.init)
|
||||
let name = components.removeFirst()
|
||||
let variables = components.joined(separator: ":").characters.split(separator: ",").map { Variable(String($0)) }
|
||||
return (name, variables)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user