mod error;
pub mod macros;
pub mod modifier;
mod parser;
mod renderer;
mod template;
pub mod value;
mod variable_container;
#[macro_use]
extern crate pest_derive;
#[macro_use]
extern crate log;
use modifier::Modifier;
use parser::{parse, ParseError};
use renderer::RenderContext;
use std::{collections::HashMap, hash::Hash};
use template::{Render, Template};
use variable_container::VariableContainer;
#[derive(Default)]
pub struct MiniTemplate<K: Eq + Hash> {
modifier: HashMap<&'static str, &'static Modifier>,
template: HashMap<K, Template>,
}
impl<K: Eq + Hash> MiniTemplate<K> {
#[deprecated]
pub fn new() -> Self {
MiniTemplate {
modifier: HashMap::new(),
template: HashMap::new(),
}
}
pub fn add_default_modifiers(&mut self) {
use modifier::*;
self.add_modifier("slice", &slice_modifier);
#[cfg(feature = "regex")]
{
self.add_modifier("regex", &match_modifier);
self.add_modifier("match", &match_modifier);
self.add_modifier("replace_regex", &replace_regex_modifier);
}
self.add_modifier("replace", &replace_modifier);
self.add_modifier("upper", &upper);
self.add_modifier("lower", &lower);
self.add_modifier("repeat", &repeat);
self.add_modifier("add", &add);
self.add_modifier("sub", &sub);
self.add_modifier("mul", &mul);
self.add_modifier("div", &div);
}
pub fn add_modifier(&mut self, key: &'static str, modifier: &'static Modifier) {
self.modifier.insert(key, modifier);
}
pub fn add_template(&mut self, key: K, tpl: String) -> Result<Option<Template>, ParseError> {
let tpl = parse(tpl)?;
Ok(self.template.insert(key, tpl))
}
pub fn render<VC: VariableContainer>(&self, key: &K, data: VC) -> error::Result<String> {
let tpl = match self.template.get(key) {
Some(t) => t,
None => return Err(error::Error::UnknownTemplate),
};
let mut context = RenderContext::new(&self.modifier, data);
let mut buf = String::new();
tpl.render(&mut context, &mut buf)?;
Ok(buf)
}
}