rsql_rs/ast/
expr.rs

1use crate::ast::comparison::Comparison;
2use crate::ast::constraint::Constraint;
3use crate::ast::Operator;
4use crate::ParserResult;
5use serde::{Deserialize, Serialize};
6use std::fmt::Debug;
7
8#[derive(Debug, PartialEq, Eq, Serialize, Deserialize)]
9#[serde(tag = "@type", content = "@data")]
10pub enum Expr {
11    Item(Constraint),
12    Node(Operator, Box<Expr>, Box<Expr>),
13}
14
15impl Expr {
16    pub fn boxed_item(
17        selector: &str, comparision: &Comparison, arguments: &[&str],
18    ) -> ParserResult<Box<Expr>> {
19        let res = Constraint::new(selector, comparision, arguments)?;
20        Ok(Box::new(Expr::Item(res)))
21    }
22}
23
24#[cfg(test)]
25mod tests {
26    use crate::ast::comparison;
27    use crate::ast::comparison::Comparison;
28    use crate::ast::constraint::Constraint;
29    use crate::ast::expr::Expr;
30    use crate::ast::Operator;
31    use crate::ParserResult;
32
33    #[test]
34    fn test_node() -> ParserResult<()> {
35        let const1 =
36            Expr::Item(Constraint::new("select1", &comparison::EQUAL as &Comparison, &["test1a"])?);
37        let const2 =
38            Expr::Item(Constraint::new("select2", &comparison::NOT_EQUAL as &Comparison, &[
39                "test2a",
40            ])?);
41        let const3 =
42            Expr::Item(Constraint::new("select3", &comparison::GREATER_THAN as &Comparison, &[
43                "test3a",
44            ])?);
45        let const4 = Expr::Item(Constraint::new("select4", &comparison::IN as &Comparison, &[
46            "test4a", "test4b",
47        ])?);
48
49        let node1 = Expr::Node(Operator::And, Box::new(const1), Box::new(const3));
50        let node2 = Expr::Node(Operator::Or, Box::new(const2), Box::new(const4));
51        let root = Expr::Node(Operator::And, Box::new(node1), Box::new(node2));
52
53        println!("root: {:?}", root);
54
55        Ok(())
56    }
57}