rocket_dyn_templates/engine/
handlebars.rs

1use std::path::Path;
2
3use handlebars::Handlebars;
4use rocket::serde::Serialize;
5
6use crate::engine::Engine;
7
8impl Engine for Handlebars<'static> {
9    const EXT: &'static str = "hbs";
10
11    fn init<'a>(templates: impl Iterator<Item = (&'a str, &'a Path)>) -> Option<Self> {
12        let mut hb = Handlebars::new();
13        let mut ok = true;
14        for (name, path) in templates {
15            if let Err(e) = hb.register_template_file(name, path) {
16                error!("Handlebars template '{}' failed to register.", name);
17                error_!("{}", e);
18                info_!("Template path: '{}'.", path.to_string_lossy());
19                ok = false;
20            }
21        }
22
23        ok.then(|| hb)
24    }
25
26    fn render<C: Serialize>(&self, name: &str, context: C) -> Option<String> {
27        if self.get_template(name).is_none() {
28            error_!("Handlebars template '{}' does not exist.", name);
29            return None;
30        }
31
32        Handlebars::render(self, name, &context)
33            .map_err(|e| error_!("Handlebars: {}", e))
34            .ok()
35    }
36}