axum_template/engine/
minijinja.rs1use 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 rendered = template.render(&data)?;
36
37 Ok(rendered)
38 }
39}
40
41#[derive(Error, Debug)]
43pub enum MinijinjaError {
44 #[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}