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}