use serde_yaml;
use once_cell::sync::Lazy;
use handlebars::{Handlebars,RenderError};
static HANDLEBARS: Lazy<Handlebars> = Lazy::new(|| {
let mut hb = Handlebars::new();
hb.register_escape_fn(handlebars::no_escape);
hb.set_strict_mode(true);
return hb;
});
#[derive(PartialEq,Copy,Clone,Debug)]
pub enum TemplateMode {
Strict,
Off
}
pub struct Templar {
}
impl Templar {
pub fn new() -> Self {
return Self {
};
}
pub fn render(&self, template: &String, data: serde_yaml::Mapping, template_mode: TemplateMode) -> Result<String, String> {
let result : Result<String, RenderError> = match template_mode {
TemplateMode::Strict => HANDLEBARS.render_template(template, &data),
TemplateMode::Off => Ok(String::from("empty"))
};
return match result {
Ok(x) => {
Ok(x)
},
Err(y) => {
Err(format!("Template error: {}", y.desc))
}
}
}
pub fn test_condition(&self, expr: &String, data: serde_yaml::Mapping, template_mode: TemplateMode) -> Result<bool, String> {
if template_mode == TemplateMode::Off {
return Ok(true);
}
let template = format!("{{{{#if {expr} }}}}true{{{{ else }}}}false{{{{/if}}}}");
let result = self.render(&template, data, TemplateMode::Strict);
match result {
Ok(x) => {
if x.as_str().eq("true") {
return Ok(true);
} else {
return Ok(false);
}
},
Err(y) => {
if y.find("Couldn't read parameter").is_some() {
return Err(format!("failed to parse conditional: {}: one or more parameters may be undefined", expr))
}
else {
return Err(format!("failed to parse conditional: {}: {}", expr, y))
}
}
};
}
}