rocket_dyn_templates/engine/
tera.rs

1use std::path::Path;
2use std::error::Error;
3
4use tera::{Context, Tera};
5use rocket::serde::Serialize;
6
7use crate::engine::Engine;
8
9impl Engine for Tera {
10    const EXT: &'static str = "tera";
11
12    fn init<'a>(templates: impl Iterator<Item = (&'a str, &'a Path)>) -> Option<Self> {
13        // Create the Tera instance.
14        let mut tera = Tera::default();
15        let ext = [".html.tera", ".htm.tera", ".xml.tera", ".html", ".htm", ".xml"];
16        tera.autoescape_on(ext.to_vec());
17
18        // Collect into a tuple of (name, path) for Tera. If we register one at
19        // a time, it will complain about unregistered base templates.
20        let files = templates.map(|(name, path)| (path, Some(name)));
21
22        // Finally try to tell Tera about all of the templates.
23        if let Err(e) = tera.add_template_files(files) {
24            error!("Failed to initialize Tera templating.");
25
26            let mut error = Some(&e as &dyn Error);
27            while let Some(err) = error {
28                info_!("{}", err);
29                error = err.source();
30            }
31
32            None
33        } else {
34            Some(tera)
35        }
36    }
37
38    fn render<C: Serialize>(&self, name: &str, context: C) -> Option<String> {
39        if self.get_template(name).is_err() {
40            error_!("Tera template '{}' does not exist.", name);
41            return None;
42        };
43
44        let tera_ctx = Context::from_serialize(context)
45            .map_err(|e| error_!("Tera context error: {}.", e))
46            .ok()?;
47
48        match Tera::render(self, name, &tera_ctx) {
49            Ok(string) => Some(string),
50            Err(e) => {
51                error_!("Error rendering Tera template '{name}': {e}");
52                let mut error = Some(&e as &dyn Error);
53                while let Some(err) = error {
54                    error_!("{}", err);
55                    error = err.source();
56                }
57
58                None
59            }
60        }
61    }
62}