/
query_parser.go
75 lines (68 loc) · 1.89 KB
/
query_parser.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package parser
import (
"github.com/Jeffail/benthos/v3/internal/bloblang/query"
)
func queryParser(pCtx Context) func(input []rune) Result {
rootParser := parseWithTails(Expect(
OneOf(
matchExpressionParser(pCtx),
ifExpressionParser(pCtx),
lambdaExpressionParser(pCtx),
bracketsExpressionParser(pCtx),
literalValueParser(pCtx),
functionParser(pCtx),
variableLiteralParser(),
fieldLiteralRootParser(pCtx),
),
"query",
), pCtx)
return func(input []rune) Result {
res := SpacesAndTabs()(input)
return arithmeticParser(rootParser)(res.Remaining)
}
}
// ParseDeprecatedQuery parses an input into a query.Function, but permits
// deprecated function interpolations. In order to support old functions this
// parser does not include field literals.
//
// TODO: V4 Remove this
func ParseDeprecatedQuery(pCtx Context, isDeprecated *bool) Func {
return func(input []rune) Result {
rootParser := OneOf(
matchExpressionParser(pCtx),
ifExpressionParser(pCtx),
parseWithTails(bracketsExpressionParser(pCtx), pCtx),
parseWithTails(literalValueParser(pCtx), pCtx),
parseWithTails(functionParser(pCtx), pCtx),
parseDeprecatedFunction(isDeprecated),
)
res := SpacesAndTabs()(input)
res = arithmeticParser(rootParser)(res.Remaining)
if res.Err != nil {
return Fail(res.Err, input)
}
result := res.Payload
res = SpacesAndTabs()(res.Remaining)
return Success(result, res.Remaining)
}
}
func tryParseQuery(expr string, deprecated bool) (query.Function, *Error) {
pCtx := Context{
Functions: query.AllFunctions,
Methods: query.AllMethods,
}
var res Result
if deprecated {
var isDep bool
res = ParseDeprecatedQuery(pCtx, &isDep)([]rune(expr))
} else {
res = queryParser(Context{
Functions: query.AllFunctions,
Methods: query.AllMethods,
})([]rune(expr))
}
if res.Err != nil {
return nil, res.Err
}
return res.Payload.(query.Function), nil
}