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}