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