mod error;
mod expr;
mod parser;
mod token;
mod transform;
use std::fmt::Debug;
pub use error::Error;
pub use expr::Expr;
pub use transform::{Transform, TransformContext, TransformResult};
#[derive(Clone, PartialEq)]
pub struct FilterExpr {
expr: Option<Expr>,
}
impl Debug for FilterExpr {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match &self.expr {
Some(expr) => write!(f, "{:?}", expr),
None => write!(f, "Empty"),
}
}
}
impl FilterExpr {
pub fn parse(expr: &str) -> Result<Self, Error> {
if expr.trim().is_empty() {
return Ok(Self { expr: None });
}
let expr = parse_expr(expr)?;
Ok(Self { expr: Some(expr) })
}
pub fn is_empty(&self) -> bool {
self.expr.is_none()
}
pub fn new(expr: Option<Expr>) -> Self {
Self { expr }
}
pub fn expr(&self) -> Option<&Expr> {
self.expr.as_ref()
}
pub async fn transform<F: Transform>(self, transformer: &mut F) -> Result<Self, Error> {
Ok(Self {
expr: match self.expr {
Some(expr) => Some(expr.transform(transformer).await?),
None => None,
},
})
}
}
fn parse_expr(input: &str) -> Result<Expr, Error> {
let tokens = token::parse_token(input)?;
let mut parser = parser::Parser::new(tokens);
parser.parse_expr()
}