open_pql/range_parser/ast/
term.rs

1use super::{From, RangeCard, Span, list::List};
2
3#[derive(Clone, PartialEq, Eq, Debug)]
4pub struct Term {
5    pub inner: Vec<Elem>,
6}
7
8impl From<Vec<Elem>> for Term {
9    fn from(inner: Vec<Elem>) -> Self {
10        Self { inner }
11    }
12}
13
14impl From<Span> for Term {
15    fn from(s: Span) -> Self {
16        Self {
17            inner: vec![Elem::Span(s)],
18        }
19    }
20}
21
22#[derive(Clone, PartialEq, Eq, Debug)]
23pub enum Elem {
24    Card(RangeCard),
25    List(List),
26    Span(Span),
27}
28
29#[cfg(test)]
30mod tests {
31    use super::super::{
32        super::tests::{parse_card as c, parse_term as p},
33        ListElem as E, RankConst as R, Span as S, SpanElem as SE,
34        TermElem as TE,
35    };
36
37    #[test]
38    fn testcard() {
39        assert_eq!(
40            p("AsA").unwrap().inner,
41            vec![TE::Card(c("As").unwrap()), TE::Card(c("A").unwrap())]
42        );
43    }
44
45    #[test]
46    fn test_list() {
47        assert_eq!(
48            p("[A,K]").unwrap().inner,
49            vec![TE::List(vec![E::CA(R::RA), E::CA(R::RK)].into())]
50        );
51
52        assert_eq!(
53            p("[A]").unwrap().inner,
54            vec![TE::List(vec![E::CA(R::RA)].into())]
55        );
56
57        assert_eq!(
58            p("[A,]").unwrap().inner,
59            vec![TE::List(vec![E::CA(R::RA)].into())]
60        );
61    }
62
63    #[test]
64    fn test_span() {
65        let span = S::Down(vec![SE::CA(R::RA)]);
66
67        assert_eq!(p("[A-]").unwrap().inner, vec![TE::Span(span.clone())]);
68
69        assert_eq!(p("A-").unwrap().inner, vec![TE::Span(span)]);
70    }
71
72    #[test]
73    fn test_term() {
74        assert_eq!(
75            p("R[A,K]").unwrap().inner,
76            vec![
77                TE::Card(c("R").unwrap()),
78                TE::List(vec![E::CA(R::RA), E::CA(R::RK)].into()),
79            ]
80        );
81    }
82}