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 async fn transform<F: Transform>(self, transformer: &mut F) -> Result<Self, Error> {
46 Ok(Self {
47 expr: match self.expr {
48 Some(expr) => Some(expr.transform(transformer).await?),
49 None => None,
50 },
51 })
52 }
53}
54
55fn parse_expr(input: &str) -> Result<Expr, Error> {
56 let tokens = token::parse_token(input)?;
57 let mut parser = parser::Parser::new(tokens);
58 parser.parse_expr()
59}