rsql_rs/parser/
fiql.rs

1use crate::ast::comparison::Comparison;
2use crate::ast::constraint::{Arguments};
3use crate::ast::expr::Expr;
4use crate::ast::{comparison};
5use crate::error::ParserError;
6use crate::parser::Parser;
7use crate::ParserResult;
8use pest::iterators::Pair;
9use pest::Parser as PestParser;
10use std::collections::{HashMap, HashSet};
11use std::convert::{TryFrom, TryInto};
12use std::iter::FromIterator;
13
14lazy_static! {
15    pub(crate) static ref DEFAULT_COMPS_MAP: HashMap<&'static str, &'static Comparison> = {
16        let tuple_vec: HashSet<&'static Comparison> = HashSet::from_iter(vec![
17            &comparison::EQUAL as &'static Comparison,
18            &comparison::NOT_EQUAL as &'static Comparison,
19            &comparison::GREATER_THAN as &'static Comparison,
20            &comparison::GREATER_THAN_OR_EQUAL as &'static Comparison,
21            &comparison::LESS_THAN as &'static Comparison,
22            &comparison::LESS_THAN_OR_EQUAL as &'static Comparison,
23        ]);
24        let tuple_vec: Vec<(&'static str, &'static Comparison)> = tuple_vec
25            .iter()
26            .flat_map(|&comp| comp.symbols.iter().map(move |sym| (sym.as_str(), comp)))
27            .collect();
28        tuple_vec.into_iter().collect()
29    };
30}
31
32#[derive(Parser)]
33#[grammar = "fiql.pest"]
34pub struct FiqlParser;
35gen_parser!(FiqlParser);
36
37impl Parser for FiqlParser {
38    type R = Rule;
39
40    gen_parser_to_node!();
41
42    fn default_comparisons() -> &'static HashMap<&'static str, &'static Comparison> {
43        &DEFAULT_COMPS_MAP as &'static HashMap<&'static str, &'static Comparison>
44    }
45}
46
47impl<'i> TryFrom<Pair<'i, Rule>> for Arguments {
48    type Error = ParserError;
49
50    fn try_from(value: Pair<'i, Rule>) -> Result<Self, Self::Error> {
51        let arg = value.as_str();
52        Ok(Arguments(vec![arg.to_string()]))
53    }
54}
55
56#[cfg(test)]
57mod tests {
58    use crate::parser::fiql::*;
59    use crate::parser::Parser;
60    use crate::ParserResult;
61
62    #[test]
63    fn default_fiql_map_test() -> ParserResult<()> {
64        let _ = env_logger::builder().is_test(true).try_init();
65        let _ = FiqlParser::default_comparisons();
66        Ok(())
67    }
68}