filter-expr
A library for parsing the filter expression.
use ;
let f = parse.unwrap;
let ctx = new;
let result = f.eval.await.unwrap;
assert_eq!;
Syntax
Filter
<filter> = <expression> | <empty>
<empty> =
Expression
<expression> = <sequence> ('AND' <sequence>)*
<sequence> = <factor>+
<factor> = <term> ('OR' <term>)*
<term> = ['NOT' | '-'] <simple>
<simple> = <restriction> | <composite>
Restriction
<restriction> = <comparable> [<operator> <arg>]
E.g. name = 'John' or age > 18 or 1 > 0.
Composite
<composite> = '(' <expression> ')'
E.g. (age + 18).
Comparable
<comparable> = <member> | <function> | <value>
E.g. name or age or 1.
Operator
<operator> = '=' | '>' | '<' | '>=' | '<=' | '!=' | 'IN' | 'NOT' 'IN'
Arg
<arg> = <comparable> | <composite>
E.g. 'John' or 18 or 1.0 or (age + 18).
Member
<member> = <field> ('.' <field>)*
E.g. name or user.name or user.address.city.
Field
E.g. name or user_name or user_address_city.
Value
<value> = <string>
| <integer>
| <float>
| <boolean>
| <null>
| <array>
| <object>
<string> = <single-quoted-string> | <double-quoted-string>
<boolean> = 'true' | 'false'
<integer> = /* an integer number */
<float> = /* a floating-point number */
<null> = 'null'
<array> = '[' [<value> (',' <value>)* ','?] ']'
<object> = '{' [<string> ':' <value> (',' <string> ':' <value>)* ','?] '}'
Examples:
'John'181.0truefalsenull[1, 2, 3]{'a': 1, 'b': 2}