openpql_range_parser/ast/
term.rs

1use super::{Display, From, List, RangeCard, Span, ToString};
2
3#[derive(Clone, PartialEq, Eq, Debug, derive_more::From, Display)]
4#[display("{}", to_str(_0))]
5pub struct Term(pub Vec<TermElem>);
6
7impl From<Span> for Term {
8    fn from(s: Span) -> Self {
9        Self(vec![TermElem::Span(s)])
10    }
11}
12
13#[derive(Clone, PartialEq, Eq, Debug, Display)]
14pub enum TermElem {
15    #[display("{_0}")]
16    Card(RangeCard),
17    #[display("{_0}")]
18    List(List),
19    #[display("{_0}")]
20    Span(Span),
21}
22
23fn to_str(elems: &[TermElem]) -> String {
24    elems.iter().map(ToString::to_string).collect::<String>()
25}
26
27#[cfg(test)]
28#[cfg_attr(coverage_nightly, coverage(off))]
29mod tests {
30    use crate::*;
31
32    fn assert_term(src: &str, expected: &str) {
33        let list = parse_term(src).unwrap();
34
35        assert_eq!(list.to_string(), expected, "{src} != {expected}");
36    }
37
38    #[test]
39    fn test_card() {
40        assert_term("AsA", "AsA");
41    }
42
43    #[test]
44    fn test_list() {
45        assert_term("[A,K]", "[A,K]");
46        assert_term("[A]", "[A]");
47        assert_term("[A,]", "[A]");
48    }
49
50    #[test]
51    fn test_span() {
52        assert_term("[A-]", "A-");
53        assert_term("A-", "A-");
54    }
55
56    #[test]
57    fn test_term() {
58        assert_term("R[A,K]", "R[A,K]");
59    }
60
61    #[test]
62    fn test_span_error_invalid() {
63        assert_err(parse_term("A[A]+ "), Error::InvalidSpan((0, 5)));
64        assert_err(parse_term("A[A-]-"), Error::InvalidSpan((0, 6)));
65        assert_err(parse_term("[A]-A "), Error::InvalidSpan((0, 5)));
66        assert_err(parse_term("A-[A] "), Error::InvalidSpan((0, 5)));
67    }
68}