1mod error;
4mod expr;
5mod parser;
6mod token;
7
8pub use error::Error;
9pub use expr::{Expr, Transform};
10
11pub struct FilterExpr {
13 expr: Option<Expr>,
15}
16
17impl FilterExpr {
18 pub fn parse(expr: &str) -> Result<Self, Error> {
26 if expr.trim().is_empty() {
27 return Ok(Self { expr: None });
28 }
29
30 let expr = parse_expr(expr)?;
31 Ok(Self { expr: Some(expr) })
32 }
33
34 pub fn new(expr: Option<Expr>) -> Self {
36 Self { expr }
37 }
38
39 pub fn expr(&self) -> Option<&Expr> {
41 self.expr.as_ref()
42 }
43
44 pub fn transform<F: Transform>(self, transformer: &mut F) -> Self {
46 Self {
47 expr: self.expr.map(|expr| expr.transform(transformer)),
48 }
49 }
50}
51
52fn parse_expr(input: &str) -> Result<Expr, Error> {
53 let tokens = token::parse_token(input)?;
54 let mut parser = parser::Parser::new(tokens);
55 parser.parse_expr()
56}