filter_expr/
lib.rs

1//! A library for parsing the filter expression.
2
3mod error;
4mod expr;
5mod parser;
6mod token;
7
8pub use error::Error;
9pub use expr::{Expr, Transform};
10
11/// The filter expression.
12pub struct FilterExpr {
13    /// The expression of the filter. Possibly empty.
14    expr: Option<Expr>,
15}
16
17impl FilterExpr {
18    /// Parse the filter expression.
19    ///
20    /// ```rust
21    /// use filter_expr::FilterExpr;
22    ///
23    /// let filter_expr = FilterExpr::parse("name = 'John' AND age > 18").unwrap();
24    /// ```
25    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    /// Create a new filter expression with the given expression.
35    pub fn new(expr: Option<Expr>) -> Self {
36        Self { expr }
37    }
38
39    /// Get the expression of the filter.
40    pub fn expr(&self) -> Option<&Expr> {
41        self.expr.as_ref()
42    }
43
44    /// Transform the filter expression.
45    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}