diff options
Diffstat (limited to 'crates/rebel/src/template.rs')
-rw-r--r-- | crates/rebel/src/template.rs | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/crates/rebel/src/template.rs b/crates/rebel/src/template.rs new file mode 100644 index 0000000..50fb334 --- /dev/null +++ b/crates/rebel/src/template.rs @@ -0,0 +1,41 @@ +use handlebars::Handlebars; +use lazy_static::lazy_static; + +use rebel_common::error::*; +use rebel_resolve::args::TaskArgs; + +fn escape_sh(s: &str) -> String { + format!("'{}'", s.replace('\'', "'\\''")) +} + +#[derive(Debug)] +pub struct TemplateEngine { + tpl: Handlebars<'static>, + tpl_sh: Handlebars<'static>, +} + +impl TemplateEngine { + pub fn new() -> Self { + let mut tpl = Handlebars::new(); + tpl.set_strict_mode(true); + tpl.register_escape_fn(handlebars::no_escape); + + let mut tpl_sh = Handlebars::new(); + tpl_sh.set_strict_mode(true); + tpl_sh.register_escape_fn(escape_sh); + + TemplateEngine { tpl, tpl_sh } + } + + pub fn eval(&self, input: &str, args: &TaskArgs) -> Result<String> { + self.tpl.render_template(input, args).map_err(Error::new) + } + + pub fn eval_sh(&self, input: &str, args: &TaskArgs) -> Result<String> { + self.tpl_sh.render_template(input, args).map_err(Error::new) + } +} + +lazy_static! { + pub static ref ENGINE: TemplateEngine = TemplateEngine::new(); +} |