open_pql/range_parser/ast/
list.rs

1use 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}