1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
use crate::Arguments; use crate::Comparison; use crate::error::ParserError; use crate::parser::Parser; use pest::iterators::Pair; use pest::Parser as PestParser; use std::collections::HashMap; use std::convert::{TryFrom, TryInto}; #[derive(Parser, Default)] #[grammar = "rsql.pest"] pub struct RsqlParser(HashMap<String, Comparison>); gen_parser!(RsqlParser); impl Parser for RsqlParser { type R = Rule; gen_basic_parser!(RSQL); } impl<'i> TryFrom<Pair<'i, Rule>> for Arguments { type Error = ParserError; fn try_from(value: Pair<'i, Rule>) -> Result<Self, Self::Error> { match value.as_rule() { Rule::argument => { let mut args = vec![]; for arg_item in value.into_inner() { let item_rules = arg_item.as_rule(); let args_inner = arg_item.into_inner(); match item_rules { Rule::value => { for arg_inner in args_inner { match arg_inner.as_rule() { Rule::unreserved_str => { for unreserved_inner in arg_inner.into_inner() { if unreserved_inner.as_rule() == Rule::unreserved_inner { args.push(unreserved_inner.as_str().to_string()); } } } Rule::double_quoted => { for double_inner in arg_inner.into_inner() { if double_inner.as_rule() == Rule::double_quoted_inner { args.push(double_inner.as_str().to_string()); } } } Rule::single_quoted => { for single_inner in arg_inner.into_inner() { if single_inner.as_rule() == Rule::single_quoted_inner { args.push(single_inner.as_str().to_string()); } } } _ => ParserError::invalid_pair_rule()?, } } } _ => ParserError::invalid_pair_rule()?, } } Ok(Arguments(args)) } _ => ParserError::invalid_pair_rule()?, } } }