use std::path::Path;
use serde::Serialize;
use crate::{controller::views::ViewRenderer, Error, Result};
const VIEWS_DIR: &str = "assets/views/";
const VIEWS_GLOB: &str = "assets/views/**/*.html";
#[derive(Clone, Debug)]
pub struct TeraView {
pub tera: tera::Tera,
pub default_context: tera::Context,
}
impl TeraView {
pub fn build() -> Result<Self> {
if !Path::new(VIEWS_DIR).exists() {
return Err(Error::string(&format!(
"missing views directory: `{VIEWS_DIR}`"
)));
}
let tera = tera::Tera::new(VIEWS_GLOB)?;
let ctx = tera::Context::default();
Ok(Self {
tera,
default_context: ctx,
})
}
}
impl ViewRenderer for TeraView {
fn render<S: Serialize>(&self, key: &str, data: S) -> Result<String> {
let context = tera::Context::from_serialize(data)?;
Ok(self.tera.render(key, &context)?)
}
}