mod parse;
mod value;
mod rule;
pub use value::ValueDef;
pub use rule::{Rule, State};
use std::collections::HashMap;
use std::io::BufRead;
use crate::error::TemplateError;
use crate::parser::Parser;
#[derive(Debug, Clone)]
pub struct Template {
values: Vec<ValueDef>,
#[allow(dead_code)]
value_index: HashMap<String, usize>,
#[allow(dead_code)]
value_templates: HashMap<String, String>,
states: HashMap<String, State>,
state_order: Vec<String>,
}
impl Template {
pub fn parse<R: BufRead>(reader: R) -> Result<Self, TemplateError> {
parse::parse_template(reader)
}
pub fn parse_str(s: &str) -> Result<Self, TemplateError> {
Self::parse(s.as_bytes())
}
pub fn parser(&self) -> Parser<'_> {
Parser::new(self)
}
pub fn values(&self) -> &[ValueDef] {
&self.values
}
pub fn header(&self) -> Vec<&str> {
self.values.iter().map(|v| v.name.as_str()).collect()
}
pub fn get_state(&self, name: &str) -> Option<&State> {
self.states.get(name)
}
pub fn state_order(&self) -> &[String] {
&self.state_order
}
#[allow(dead_code)]
pub(crate) fn value_templates(&self) -> &HashMap<String, String> {
&self.value_templates
}
#[allow(dead_code)]
pub(crate) fn value_index(&self, name: &str) -> Option<usize> {
self.value_index.get(name).copied()
}
}