summaryrefslogtreecommitdiffstats
path: root/crates/rebel/src/template.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/rebel/src/template.rs')
-rw-r--r--crates/rebel/src/template.rs41
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();
+}