1mod error;
4mod expr;
5mod parser;
6mod token;
7mod transform;
8
9use std::fmt::Debug;
10
11pub use error::Error;
12pub use expr::Expr;
13pub use transform::{Transform, TransformContext, TransformResult};
14
15#[derive(Clone, PartialEq)]
17pub struct FilterExpr {
18 expr: Option<Expr>,
20}
21
22impl Debug for FilterExpr {
23 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
24 match &self.expr {
25 Some(expr) => write!(f, "{:?}", expr),
26 None => write!(f, "Empty"),
27 }
28 }
29}
30
31impl FilterExpr {
32 pub fn parse(expr: &str) -> Result<Self, Error> {
40 if expr.trim().is_empty() {
41 return Ok(Self { expr: None });
42 }
43
44 let expr = parse_expr(expr)?;
45 Ok(Self { expr: Some(expr) })
46 }
47
48 pub fn is_empty(&self) -> bool {
50 self.expr.is_none()
51 }
52
53 pub fn new(expr: Option<Expr>) -> Self {
55 Self { expr }
56 }
57
58 pub fn expr(&self) -> Option<&Expr> {
60 self.expr.as_ref()
61 }
62
63 pub async fn transform<F: Transform>(self, transformer: &mut F) -> Result<Self, Error> {
65 Ok(Self {
66 expr: match self.expr {
67 Some(expr) => Some(expr.transform(transformer).await?),
68 None => None,
69 },
70 })
71 }
72}
73
74fn parse_expr(input: &str) -> Result<Expr, Error> {
75 let tokens = token::parse_token(input)?;
76 let mut parser = parser::Parser::new(tokens);
77 parser.parse_expr()
78}