use std::sync::Arc;
use alun_core::Result;
#[derive(Clone)]
pub struct TemplateEngine {
env: Arc<minijinja::Environment<'static>>,
}
impl TemplateEngine {
pub fn new() -> Self {
Self { env: Arc::new(minijinja::Environment::new()) }
}
pub fn from_dir(dir: &str) -> Result<Self> {
let mut env = minijinja::Environment::new();
env.set_loader(minijinja::path_loader(dir));
Ok(Self { env: Arc::new(env) })
}
pub fn render<C: serde::Serialize>(&self, name: &str, ctx: &C) -> Result<String> {
let tmpl = self.env
.get_template(name)
.map_err(|e| alun_core::Error::Template(format!("模板加载失败 {}: {}", name, e)))?;
let ctx_val = minijinja::value::Value::from_serialize(ctx);
tmpl.render(&ctx_val)
.map_err(|e| alun_core::Error::Template(format!("模板渲染失败: {}", e)))
}
pub fn render_str<C: serde::Serialize>(&self, source: &str, ctx: &C) -> Result<String> {
let tmpl = self.env
.template_from_str(source)
.map_err(|e| alun_core::Error::Template(format!("模板编译失败: {}", e)))?;
let ctx_val = minijinja::value::Value::from_serialize(ctx);
tmpl.render(&ctx_val)
.map_err(|e| alun_core::Error::Template(format!("模板渲染失败: {}", e)))
}
}
impl Default for TemplateEngine {
fn default() -> Self { Self::new() }
}