1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
use std::path::Path;

use handlebars::Handlebars;
use rocket::serde::Serialize;

use crate::engine::Engine;

impl Engine for Handlebars<'static> {
    const EXT: &'static str = "hbs";

    fn init<'a>(templates: impl Iterator<Item = (&'a str, &'a Path)>) -> Option<Self> {
        let mut hb = Handlebars::new();
        let mut ok = true;
        for (name, path) in templates {
            if let Err(e) = hb.register_template_file(name, path) {
                error!("Handlebars template '{}' failed to register.", name);
                error_!("{}", e);
                info_!("Template path: '{}'.", path.to_string_lossy());
                ok = false;
            }
        }

        ok.then(|| hb)
    }

    fn render<C: Serialize>(&self, name: &str, context: C) -> Option<String> {
        if self.get_template(name).is_none() {
            error_!("Handlebars template '{}' does not exist.", name);
            return None;
        }

        Handlebars::render(self, name, &context)
            .map_err(|e| error_!("Handlebars: {}", e))
            .ok()
    }
}