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 is_empty(&self) -> bool {
36 self.expr.is_none()
37 }
38
39 pub fn new(expr: Option<Expr>) -> Self {
41 Self { expr }
42 }
43
44 pub fn expr(&self) -> Option<&Expr> {
46 self.expr.as_ref()
47 }
48
49 pub async fn transform<F: Transform>(self, transformer: &mut F) -> Result<Self, Error> {
51 Ok(Self {
52 expr: match self.expr {
53 Some(expr) => Some(expr.transform(transformer).await?),
54 None => None,
55 },
56 })
57 }
58}
59
60fn parse_expr(input: &str) -> Result<Expr, Error> {
61 let tokens = token::parse_token(input)?;
62 let mut parser = parser::Parser::new(tokens);
63 parser.parse_expr()
64}