openpql_pql_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 UnrecognizedSelector(LocInfo),
11 DuplicatedKeyInFrom(LocInfo),
12 DuplicatedSelectorName(LocInfo),
13 InvalidNumericValue(LocInfo),
14}
15
16pub type LalrError<'input> = ParseError<Loc, Token<'input>, Error>;
17
18pub type ResultE<'input, T> = Result<T, LalrError<'input>>;
19
20pub const fn user_err<'input>(error: Error) -> LalrError<'input> {
21 ParseError::User { error }
22}
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::UnrecognizedSelector(loc)
56 | Error::DuplicatedKeyInFrom(loc)
57 | Error::DuplicatedSelectorName(loc)
58 | Error::InvalidNumericValue(loc) => *loc,
59 }
60 }
61}
62
63#[cfg(test)]
64mod tests {
65 use super::*;
66
67 #[test]
68 fn test_into_loc() {
69 let loc = (1, 2);
70
71 assert_eq!(loc, (&Error::InvalidToken(loc)).into());
72 assert_eq!(loc, (&Error::UnrecognizedEof(loc, vec![])).into());
73 assert_eq!(loc, (&Error::UnrecognizedToken(loc, vec![])).into());
74 assert_eq!(loc, (&Error::ExtraToken(loc)).into());
75 assert_eq!(loc, (&Error::UnrecognizedSelector(loc)).into());
76 assert_eq!(loc, (&Error::DuplicatedKeyInFrom(loc)).into());
77 assert_eq!(loc, (&Error::DuplicatedSelectorName(loc)).into());
78 assert_eq!(loc, (&Error::InvalidNumericValue(loc)).into());
79 }
80
81 #[test]
82 fn test_error() {
83 let err = LalrError::ExtraToken {
84 token: (0, Token(0, "a"), 1),
85 };
86
87 assert_eq!(Error::ExtraToken((0, 1)), err.into());
88 }
89}