open_pql/pql_parser/
error.rs

1use super::*;
2
3#[derive(Debug, Clone, PartialEq, Eq)]
4pub enum Error {
5    InvalidToken(LocInfo),
6    UnrecognizedEof(LocInfo, Expected),
7    UnrecognizedToken(LocInfo, Expected),
8
9    ExtraToken(LocInfo),
10    UnrecognizedSelector(LocInfo),
11    DuplicatedKeyInFrom(LocInfo),
12    DuplicatedSelectorName(LocInfo),
13}
14
15pub(super) type LalrError<'input> = ParseError<Loc, Token<'input>, Error>;
16
17pub(super) type ResultE<'input, T> = Result<T, LalrError<'input>>;
18
19pub(super) const fn user_err<'input>(error: Error) -> LalrError<'input> {
20    ParseError::User { error }
21}
22
23impl<'input> From<LalrError<'input>> for Error {
24    fn from(err: LalrError<'input>) -> Self {
25        match err {
26            ParseError::InvalidToken { location: l } => {
27                Self::InvalidToken((l, l + 1))
28            }
29
30            ParseError::UnrecognizedEof {
31                location: l,
32                expected: v,
33            } => Self::UnrecognizedEof((l, l + 1), v),
34
35            ParseError::UnrecognizedToken {
36                token: t,
37                expected: v,
38            } => Self::UnrecognizedToken((t.0, t.2), v),
39
40            ParseError::ExtraToken { token: t } => Self::ExtraToken((t.0, t.2)),
41
42            ParseError::User { error } => error,
43        }
44    }
45}
46
47impl From<&Error> for LocInfo {
48    fn from(e: &Error) -> Self {
49        match e {
50            Error::InvalidToken(loc)
51            | Error::UnrecognizedEof(loc, _)
52            | Error::UnrecognizedToken(loc, _)
53            | Error::ExtraToken(loc)
54            | Error::UnrecognizedSelector(loc)
55            | Error::DuplicatedKeyInFrom(loc)
56            | Error::DuplicatedSelectorName(loc) => *loc,
57        }
58    }
59}
60
61#[cfg(test)]
62mod tests {
63    use super::*;
64
65    #[test]
66    fn test_into_loc() {
67        let loc = (1, 2);
68
69        assert_eq!(loc, (&Error::InvalidToken(loc)).into());
70        assert_eq!(loc, (&Error::UnrecognizedEof(loc, vec![])).into());
71        assert_eq!(loc, (&Error::UnrecognizedToken(loc, vec![])).into());
72        assert_eq!(loc, (&Error::ExtraToken(loc)).into());
73        assert_eq!(loc, (&Error::UnrecognizedSelector(loc)).into());
74        assert_eq!(loc, (&Error::DuplicatedKeyInFrom(loc)).into());
75        assert_eq!(loc, (&Error::DuplicatedSelectorName(loc)).into());
76    }
77
78    #[test]
79    fn test_error() {
80        let err = LalrError::ExtraToken {
81            token: (0, Token(0, "a"), 1),
82        };
83
84        assert_eq!(Error::ExtraToken((0, 1)), err.into());
85    }
86}