use handlebars::Handlebars;
use pillow_fs::FS;
use serde_json::Value;
use tera::Tera;
pub use tera::Context;
#[derive(Debug, Clone)]
pub enum Template {
Html(&'static str),
Handlebars(&'static str, Value),
Tera(&'static str, &'static str, Context),
}
impl Template {
pub fn render(&self) -> String {
let resources = "resources/views";
match self {
Template::Html(file) => {
let path = format!("{}/{}.html", resources, file);
FS::read_to_string(path.as_str())
}
Template::Handlebars(hbs, value) => {
let path = format!("{}/{}.hbs", resources, hbs);
let mut reg = Handlebars::new();
reg.register_template_file(&hbs, path).unwrap();
reg.render(&hbs, value).unwrap()
}
Template::Tera(name_file, ext, ctx) => {
let path = format!("{}/*", resources);
let tera = match Tera::new(&path) {
Ok(t) => t,
Err(e) => panic!("{e}"),
};
let template_file = format!("{}.{}", name_file, ext);
tera.render(&template_file, ctx)
.expect("Failed to render template")
}
}
}
}
#[cfg(test)]
mod tests {
use serde_json::json;
use super::*;
#[test]
fn it_works_html() {
let page = Template::Html("index_html");
assert_eq!(page.render(), "");
}
#[test]
fn it_works_hbs() {
let page = Template::Handlebars("index_hbs", json!({}));
println!("{:#?}", page.render());
assert_eq!(page.render(), "");
}
#[test]
fn it_works_tera_html() {
let ctx = Context::new();
let page = Template::Tera("index_tera", "html", ctx);
println!("{:#?}", page.render());
assert_eq!(page.render(), "");
}
}