use std::collections::HashMap;
use anyhow::Context as _;
use tera::Tera;
use crate::error::RenderError;
use crate::filters::register_filters;
pub struct RenderEngine {
pub(crate) tera: Tera,
}
#[derive(Default)]
pub struct RenderEngineBuilder {
templates_dir: Option<String>,
}
impl RenderEngineBuilder {
pub fn new() -> Self {
Self::default()
}
pub fn with_templates(mut self, path: &std::path::Path) -> Self {
self.templates_dir = Some(path.to_string_lossy().into_owned());
self
}
#[cfg(not(target_arch = "wasm32"))]
pub fn build(self) -> Result<RenderEngine, RenderError> {
let dir = self.templates_dir.as_deref().unwrap_or("templates");
let glob = format!("{}/**/*", dir);
let mut tera = Tera::new(&glob)
.with_context(|| format!("Failed to load templates from: {}", dir))
.map_err(|e| RenderError::TeraRender(e.to_string()))?;
register_filters(&mut tera);
Ok(RenderEngine { tera })
}
pub fn build_with_templates(
self,
templates: HashMap<String, String>,
) -> Result<RenderEngine, RenderError> {
let mut tera = Tera::default();
for (name, content) in templates {
tera.add_raw_template(&name, &content)
.with_context(|| format!("Failed to add template: {}", name))
.map_err(|e| RenderError::TeraRender(e.to_string()))?;
}
register_filters(&mut tera);
Ok(RenderEngine { tera })
}
}
impl RenderEngine {
pub fn builder() -> RenderEngineBuilder {
RenderEngineBuilder::new()
}
}