Skip to main content

foundry_template/
lib.rs

1use anyhow::Result;
2use foundry_types::TemplateEngineKind;
3use serde_json::Value;
4
5pub trait Renderer {
6    fn render(&self, template: &str, ctx: &Value) -> Result<String>;
7}
8
9pub struct HandlebarsRenderer;
10pub struct MiniJinjaRenderer;
11
12impl Renderer for HandlebarsRenderer {
13    fn render(&self, template: &str, ctx: &Value) -> Result<String> {
14        let reg = handlebars::Handlebars::new();
15        Ok(reg.render_template(template, ctx)?)
16    }
17}
18
19impl Renderer for MiniJinjaRenderer {
20    fn render(&self, template: &str, ctx: &Value) -> Result<String> {
21        let env = minijinja::Environment::new();
22        let t = env.template_from_str(template)?;
23        Ok(t.render(ctx)?)
24    }
25}
26
27pub fn renderer(kind: &TemplateEngineKind) -> Box<dyn Renderer + Send + Sync> {
28    match kind {
29        TemplateEngineKind::Handlebars => Box::new(HandlebarsRenderer),
30        TemplateEngineKind::MiniJinja => Box::new(MiniJinjaRenderer),
31    }
32}