open_pql/pql_parser/
mod.rs

1use std::{collections::hash_map::Entry, string::String};
2
3use derive_more::derive::{Display, From};
4use lalrpop_util::{lalrpop_mod, lexer::Token, ParseError};
5use rustc_hash::{FxHashMap, FxHashSet};
6
7use crate::{Loc, LocInfo};
8
9pub mod ast;
10mod error;
11
12pub use error::Error;
13use error::{user_err, ResultE};
14
15type Expected = Vec<String>;
16
17lalrpop_mod!(
18    #[allow(clippy::empty_line_after_outer_attr)]
19    #[allow(clippy::iter_nth_zero)]
20    #[allow(clippy::nursery)]
21    #[allow(clippy::pedantic)]
22    #[allow(clippy::restriction)]
23    #[allow(clippy::useless_conversion)]
24    pub(crate) parser,
25    "/pql_parser/pql.rs"
26);
27
28pub fn parse(src: &str) -> Result<Vec<ast::Stmt>, Error> {
29    Ok(parser::PQLParser::new().parse(src)?)
30}
31
32pub(super) fn strip_str(s: &str) -> &str {
33    &s[1..s.len() - 1]
34}
35
36#[cfg_attr(coverage_nightly, coverage(off))]
37#[cfg(test)]
38pub mod tests {
39    use super::*;
40
41    #[test]
42    fn test_error_invalid_token() {
43        assert_eq!(Error::InvalidToken((0, 1)), parse("?").unwrap_err());
44    }
45
46    #[test]
47    fn test_error_unrecognized_eof() {
48        let res = parse("select").unwrap_err();
49
50        if let Error::UnrecognizedEof(loc, expected) = res {
51            assert_eq!(loc, (6, 7));
52            assert_eq!(expected.len(), 1);
53        } else {
54            panic!("Expected: UnrecognizedEof. Got: {res:?}")
55        }
56    }
57
58    #[test]
59    fn test_error_unrecognized_token() {
60        let res = parse("select ()").unwrap_err();
61
62        if let Error::UnrecognizedToken(loc, expected) = res {
63            assert_eq!(loc, (7, 8));
64            assert_eq!(expected.len(), 1);
65        } else {
66            panic!("Expected: UnrecognizedToken. Got: {res:?}")
67        }
68    }
69}