open_pql/range_parser/ast/
list.rs1use super::{
2 Error, LalrError, Loc, RangeCard, RankConst as RankC, SuitConst as SuitC,
3};
4
5#[derive(Copy, Clone, PartialEq, Eq, Debug)]
6pub enum Elem {
7 CC(RankC, SuitC),
8 CA(RankC),
9 AC(SuitC),
10}
11
12#[derive(Clone, PartialEq, Eq, Debug)]
13pub struct List(pub Vec<Elem>);
14
15impl TryFrom<(Loc, Vec<RangeCard>, Loc)> for List {
16 type Error = LalrError<'static>;
17
18 fn try_from(
19 (l, v, r): (Loc, Vec<RangeCard>, Loc),
20 ) -> Result<Self, Self::Error> {
21 let mut inner = vec![];
22
23 for c in v {
24 match c {
25 RangeCard::CC(r, s) => {
26 inner.push(Elem::CC(r, s));
27 }
28 RangeCard::CA(r) => {
29 inner.push(Elem::CA(r));
30 }
31 RangeCard::AC(s) => {
32 inner.push(Elem::AC(s));
33 }
34 _ => {
35 return Err(Error::InvalidList((l, r)).into());
36 }
37 }
38 }
39
40 Ok(Self(inner))
41 }
42}
43
44impl From<Vec<Elem>> for List {
45 fn from(inner: Vec<Elem>) -> Self {
46 Self(inner)
47 }
48}
49
50#[cfg(test)]
51mod tests {
52 use super::super::{
53 super::tests::parse_list as p, ListElem as E, RangeCard,
54 RankConst as R, SuitConst as S, *,
55 };
56
57 #[quickcheck]
58 fn test_list(c: RangeCard) {
59 let src = format!("[{}]", c.to_src());
60 let res = p(&src);
61
62 let is_err = match c {
63 RangeCard::CC(_, _) | RangeCard::CA(_) | RangeCard::AC(_) => false,
64 RangeCard::CV(_, _)
65 | RangeCard::VC(_, _)
66 | RangeCard::VV(_, _)
67 | RangeCard::VA(_)
68 | RangeCard::AV(_)
69 | RangeCard::AA => true,
70 };
71
72 if is_err {
73 assert_eq!(res, Err(Error::InvalidList((0, src.len())).into()));
74 } else {
75 assert_eq!(res, Ok((0, vec![c], 0).try_into().unwrap()));
76 }
77 }
78
79 #[test]
80 fn test_list_ok() {
81 assert_eq!(p("[A,s]"), Ok(vec![E::CA(R::RA), E::AC(S::S)].into()));
82 }
83
84 #[test]
85 fn test_list_error() {
86 assert_eq!(p("[B] "), Err(Error::InvalidList((0, 3)).into()));
87 assert_eq!(p("[Bs]"), Err(Error::InvalidList((0, 4)).into()));
88 assert_eq!(p("[*w]"), Err(Error::InvalidList((0, 4)).into()));
89 assert_eq!(p("[Aw]"), Err(Error::InvalidList((0, 4)).into()));
90 assert_eq!(p("[Bw]"), Err(Error::InvalidList((0, 4)).into()));
91 assert_eq!(p("[*] "), Err(Error::InvalidList((0, 3)).into()));
92 }
93}