open_pql/range_parser/ast/
expr.rs1use 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}