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 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 let files = templates.map(|(name, path)| (path, Some(name)));
21
22 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}