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