use super::parser;
use super::Formatter;
use expression;
use function;
use metadata;
use std::collections::HashMap;
pub struct FormatParser<'a, T: metadata::Provider>
where
T: 'a,
{
functions_map: HashMap<&'a str, &'a function::Function<T>>,
}
impl<'a, T: metadata::Provider> FormatParser<'a, T> {
pub fn new(formatter: &'a Formatter<T>) -> FormatParser<'a, T> {
let mut functions_map = HashMap::new();
for func in formatter.functions().iter() {
functions_map.insert(func.name(), func);
}
FormatParser {
functions_map,
}
}
pub fn find_function(&self, name: &str) -> Option<&'a function::Function<T>> {
match self.functions_map.get(name) {
Some(func) => Some(func),
None => None,
}
}
pub fn parse<'b>(
&'b self,
string: &str,
) -> Result<expression::Expression<'a, T>, parser::ParseError> {
Ok(parser::parse(string, &self)?)
}
}