open_pql/range_parser/
error.rs

1use super::{Expected, Loc, LocInfo, ParseError, Token};
2
3#[derive(Debug, Clone, PartialEq, Eq)]
4pub enum Error {
5    InvalidToken(LocInfo),
6    UnrecognizedEof(LocInfo, Expected),
7    UnrecognizedToken(LocInfo, Expected),
8    ExtraToken(LocInfo),
9
10    TooManyCardsInRange(LocInfo),
11    NumberOfRanksMismatchInSpan(LocInfo),
12    RankDistanceMismatchInSpan(LocInfo),
13    SuitMismatchInSpan(LocInfo),
14    InvalidSpan(LocInfo),
15    InvalidList(LocInfo),
16    InvalidRank(LocInfo),
17    InvalidSuit(LocInfo),
18}
19
20pub(super) type LalrError<'input> = ParseError<Loc, Token<'input>, Error>;
21
22pub(super) type ResultE<'input, T> = Result<T, LalrError<'input>>;
23
24impl<'input> From<LalrError<'input>> for Error {
25    fn from(err: LalrError<'input>) -> Self {
26        match err {
27            ParseError::InvalidToken { location: l } => {
28                Self::InvalidToken((l, l + 1))
29            }
30
31            ParseError::UnrecognizedEof {
32                location: l,
33                expected: v,
34            } => Self::UnrecognizedEof((l, l + 1), v),
35
36            ParseError::UnrecognizedToken {
37                token: t,
38                expected: v,
39            } => Self::UnrecognizedToken((t.0, t.2), v),
40
41            ParseError::ExtraToken { token: t } => Self::ExtraToken((t.0, t.2)),
42
43            ParseError::User { error } => error,
44        }
45    }
46}
47
48impl From<&Error> for LocInfo {
49    fn from(e: &Error) -> Self {
50        match e {
51            Error::InvalidToken(loc)
52            | Error::UnrecognizedEof(loc, _)
53            | Error::UnrecognizedToken(loc, _)
54            | Error::ExtraToken(loc)
55            | Error::TooManyCardsInRange(loc)
56            | Error::NumberOfRanksMismatchInSpan(loc)
57            | Error::RankDistanceMismatchInSpan(loc)
58            | Error::SuitMismatchInSpan(loc)
59            | Error::InvalidSpan(loc)
60            | Error::InvalidList(loc)
61            | Error::InvalidRank(loc)
62            | Error::InvalidSuit(loc) => *loc,
63        }
64    }
65}