true
,false
,number
(float64 and int64),string
,identifier
- compare operations:
=
>
>=
<
<=
!=
- simple math operations:
+
-
*
/
- prefix:
-
,!
- bracket
()
- custom variable, like
$car
- custom none-variadic functions, like :
takeBus()
- in, like
$car in ('bwm','byd')
- function inputs only supported
int64
,float64
,string
,bool
- functions must have one or two returns, the first one must be one of:
int64
,float64
,string
,bool
, if the second one exists, it must be error - variables support numbers, including all ints and uints, except
uint64
- function does not support variadic args
- if
identifier
exists, then the expression can only be parsed, but cannot be evaluated
contains
endsWith
startsWith
length
toLower
toUpper
trim
concat
geoWithin2d
hasIntersection
timestampBefore
now
// return time.Now() rfc3339 formatted string
func ExampleEvaluate() {
expr := `$car in ('bwm', 'byd') and (3 + 2) * 2.0 = 10 and startsWith($car, 'b')`
variables := map[string]interface{}{`car`: `byd`}
result, err := Evaluate(expr, variables)
if err != nil {
panic(err)
}
fmt.Println(result)
// Output:
// true
}
func ExampleParseAndEvaluate() {
expr := `$car in ('bwm', 'byd') and (3 + echo_int(2)) * 2.0 = 10 and startsWith($car, 'b')`
var tInt = func(a int64) int64 {
return a
}
if err := RegisterFunc(`echo_int`, tInt); err != nil {
panic(err)
}
variables := map[string]interface{}{`car`: `byd`}
result, err := Evaluate(expr, variables)
if err != nil {
panic(err)
}
fmt.Println(result)
// Output:
// true
}