Skip to main content

axum_template/engine/
minijinja.rs

1use crate::TemplateEngine;
2
3use super::Engine;
4
5use axum::{http::StatusCode, response::IntoResponse};
6
7#[cfg(feature = "minijinja")]
8use minijinja::Environment;
9
10#[cfg(feature = "minijinja-autoreload")]
11use minijinja_autoreload::AutoReloader;
12
13use thiserror::Error;
14
15#[cfg(feature = "minijinja")]
16impl TemplateEngine for Engine<Environment<'static>> {
17    type Error = MinijinjaError;
18
19    fn render<D: serde::Serialize>(&self, key: &str, data: D) -> Result<String, Self::Error> {
20        let template = self.engine.get_template(key)?;
21        let rendered = template.render(&data)?;
22
23        Ok(rendered)
24    }
25}
26
27#[cfg(feature = "minijinja-autoreload")]
28impl TemplateEngine for Engine<AutoReloader> {
29    type Error = MinijinjaError;
30
31    fn render<D: serde::Serialize>(&self, key: &str, data: D) -> Result<String, Self::Error> {
32        let reloader = self.engine.acquire_env()?;
33        let template = reloader.get_template(key)?;
34        // let template = self.engine.get_template(key)?;
35        let rendered = template.render(&data)?;
36
37        Ok(rendered)
38    }
39}
40
41/// Error wrapper for [`minijinja::Error`]
42#[derive(Error, Debug)]
43pub enum MinijinjaError {
44    /// See [`minijinja::Error`]
45    #[error(transparent)]
46    RenderError(#[from] minijinja::Error),
47}
48
49impl IntoResponse for MinijinjaError {
50    fn into_response(self) -> axum::response::Response {
51        (StatusCode::INTERNAL_SERVER_ERROR, self.to_string()).into_response()
52    }
53}