open_pql/range_parser/ast/
expr.rs

1use super::{LocInfo, Term};
2
3#[derive(PartialEq, Eq, Debug)]
4pub enum Expr {
5    Not(Box<Expr>, Box<Expr>),
6    And(Box<Expr>, Box<Expr>),
7    Or(Box<Expr>, Box<Expr>),
8    Term(Term, LocInfo),
9}
10
11impl From<(Term, LocInfo)> for Expr {
12    fn from((t, loc): (Term, LocInfo)) -> Self {
13        Self::Term(t, loc)
14    }
15}
16
17#[cfg(test)]
18mod tests {
19
20    use super::{
21        super::{
22            super::{parse, tests::parse_term},
23            Term,
24        },
25        Expr,
26    };
27
28    fn p(s: &str) -> Expr {
29        *parse(s).unwrap()
30    }
31
32    fn t(s: &str) -> Term {
33        parse_term(s).unwrap()
34    }
35
36    #[test]
37    fn test_expr_term() {
38        assert_eq!(p("AsA"), (t("AsA"), (0, 3)).into());
39    }
40
41    #[test]
42    fn test_expr_and() {
43        assert_eq!(
44            p("AsA:ss"),
45            Expr::And(
46                Box::new((t("AsA"), (0, 3)).into()),
47                Box::new((t("ss"), (4, 6)).into())
48            )
49        );
50    }
51
52    #[test]
53    fn test_expr_or() {
54        assert_eq!(
55            p("AsA,ss"),
56            Expr::Or(
57                Box::new((t("AsA"), (0, 3)).into()),
58                Box::new((t("ss"), (4, 6)).into())
59            )
60        );
61    }
62
63    #[test]
64    fn test_expr_not() {
65        assert_eq!(
66            p("AsA!ss"),
67            Expr::Not(
68                Box::new((t("AsA"), (0, 3)).into()),
69                Box::new((t("ss"), (4, 6)).into())
70            )
71        );
72    }
73
74    #[test]
75    fn test_expr_precedence() {
76        assert_eq!(
77            p("A:B!c,d"),
78            Expr::Or(
79                Box::new(Expr::And(
80                    Box::new((t("A"), (0, 1)).into()),
81                    Box::new(Expr::Not(
82                        Box::new((t("B"), (2, 3)).into()),
83                        Box::new((t("c"), (4, 5)).into()),
84                    )),
85                )),
86                Box::new((t("d"), (6, 7)).into()),
87            ),
88        );
89
90        assert_eq!(
91            p("A:B!(c,d)"),
92            Expr::And(
93                Box::new((t("A"), (0, 1)).into()),
94                Box::new(Expr::Not(
95                    Box::new((t("B"), (2, 3)).into()),
96                    Box::new(Expr::Or(
97                        Box::new((t("c"), (5, 6)).into()),
98                        Box::new((t("d"), (7, 8)).into()),
99                    )),
100                )),
101            ),
102        );
103    }
104}