openpql_pql_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    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}