open_pql/range_parser/
error.rs1use 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}