1pub mod context;
2
3use minijinja::Environment;
4
5pub struct AdminRenderer {
6 env: Environment<'static>,
7}
8
9impl AdminRenderer {
10 pub fn new() -> Self {
11 Self::with_overrides(vec![])
12 }
13
14 pub fn with_overrides(overrides: Vec<(String, String)>) -> Self {
15 let mut env = Environment::new();
16
17 env.add_filter("basename", |value: String| -> String {
18 value.rsplit('/').next().unwrap_or(&value).to_string()
19 });
20
21 env.add_template_owned("layout.html", include_str!("../../templates/layout.html").to_string()).unwrap();
23 env.add_template_owned("login.html", include_str!("../../templates/login.html").to_string()).unwrap();
24 env.add_template_owned("list.html", include_str!("../../templates/list.html").to_string()).unwrap();
25 env.add_template_owned("list_table.html", include_str!("../../templates/list_table.html").to_string()).unwrap();
26 env.add_template_owned("form.html", include_str!("../../templates/form.html").to_string()).unwrap();
27 env.add_template_owned("flash.html", include_str!("../../templates/flash.html").to_string()).unwrap();
28 env.add_template_owned("home.html", include_str!("../../templates/home.html").to_string()).unwrap();
29 env.add_template_owned("change_password.html", include_str!("../../templates/change_password.html").to_string()).unwrap();
30 env.add_template_owned("users_list.html", include_str!("../../templates/users_list.html").to_string()).unwrap();
31 env.add_template_owned("user_form.html", include_str!("../../templates/user_form.html").to_string()).unwrap();
32 env.add_template_owned("roles.html", include_str!("../../templates/roles.html").to_string()).unwrap();
33 env.add_template_owned("role_form.html", include_str!("../../templates/role_form.html").to_string()).unwrap();
34 env.add_template_owned("role_edit_form.html", include_str!("../../templates/role_edit_form.html").to_string()).unwrap();
35 env.add_template_owned("forbidden.html", include_str!("../../templates/forbidden.html").to_string()).unwrap();
36
37 for (name, content) in overrides {
39 env.add_template_owned(name, content).unwrap();
40 }
41
42 Self { env }
43 }
44
45 pub fn render<S: serde::Serialize>(&self, template: &str, ctx: S) -> String {
46 self.env
47 .get_template(template)
48 .unwrap()
49 .render(ctx)
50 .unwrap_or_else(|e| format!("<pre>Template error: {e}</pre>"))
51 }
52}
53
54impl Default for AdminRenderer {
55 fn default() -> Self {
56 Self::new()
57 }
58}