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}