cat_gateway/
jinja.rs

1//! `minijinja` static global variables
2
3use std::sync::LazyLock;
4
5use minijinja::{Environment, Template};
6
7use crate::db::event::signed_docs::{
8    FILTERED_COUNT_SIGNED_DOCS_TEMPLATE, FILTERED_SELECT_SIGNED_DOCS_TEMPLATE,
9    SELECT_SIGNED_DOCS_TEMPLATE,
10};
11
12/// Jinja template source struct.
13pub(crate) struct JinjaTemplateSource {
14    /// Jinja template name
15    pub(crate) name: &'static str,
16    /// Jinja template source
17    pub(crate) source: &'static str,
18}
19
20/// Global static `minijinja::Environment` with all preloaded templates
21#[allow(clippy::unwrap_used)]
22static JINJA_ENV: LazyLock<Environment> = LazyLock::new(|| {
23    let mut env = minijinja::Environment::new();
24
25    // Preload templates
26    env.add_template(
27        SELECT_SIGNED_DOCS_TEMPLATE.name,
28        SELECT_SIGNED_DOCS_TEMPLATE.source,
29    )
30    .unwrap();
31    env.add_template(
32        FILTERED_SELECT_SIGNED_DOCS_TEMPLATE.name,
33        FILTERED_SELECT_SIGNED_DOCS_TEMPLATE.source,
34    )
35    .unwrap();
36    env.add_template(
37        FILTERED_COUNT_SIGNED_DOCS_TEMPLATE.name,
38        FILTERED_COUNT_SIGNED_DOCS_TEMPLATE.source,
39    )
40    .unwrap();
41
42    env
43});
44
45/// Returns a template from the jinja environment, returns error if it does not exit.
46pub(crate) fn get_template(temp: &JinjaTemplateSource) -> anyhow::Result<Template<'static, '_>> {
47    let template = JINJA_ENV.get_template(temp.name)?;
48    Ok(template)
49}