axum_template/
render.rs

1use axum::response::{Html, IntoResponse};
2use serde::Serialize;
3
4use crate::TemplateEngine;
5
6/// Rendered template response
7///
8/// Responds to the request with the rendered template and
9/// `text/plain; charset=utf-8` content-type
10///
11/// # Usage
12///
13/// ```
14/// # use axum::{response::IntoResponse};
15/// # use axum_template::{Render, TemplateEngine};
16/// use serde::Serialize;
17///
18/// #[derive(Serialize)]
19/// struct Person { /* */ }
20///
21/// async fn handler(
22///     engine: impl TemplateEngine,
23/// ) -> impl IntoResponse {
24///     let key = "Template key";
25///     let data = Person{ /* */ };
26///     Render(key, engine, data)
27/// }
28/// ```
29#[derive(Debug, Clone, PartialEq, Eq)]
30#[must_use]
31pub struct Render<K, E, S>(pub K, pub E, pub S);
32
33impl<K, E, S> IntoResponse for Render<K, E, S>
34where
35    E: TemplateEngine,
36    S: Serialize,
37    K: AsRef<str>,
38{
39    fn into_response(self) -> axum::response::Response {
40        let Render(key, engine, data) = self;
41
42        let result = engine.render(key.as_ref(), data);
43
44        match result {
45            Ok(x) => x.into_response(),
46            Err(x) => x.into_response(),
47        }
48    }
49}
50
51/// Rendered Html response
52///
53/// Responds to the request with the rendered template and
54/// `text/html` content-type
55///
56/// # Usage
57///
58/// ```
59/// # use axum::{response::IntoResponse};
60/// # use axum_template::{RenderHtml, TemplateEngine};
61/// use serde::Serialize;
62///
63/// #[derive(Serialize)]
64/// struct Person { /* */ }
65///
66/// async fn handler(
67///     engine: impl TemplateEngine,
68/// ) -> impl IntoResponse {
69///     let key = "Template key";
70///     let data = Person{ /* */ };
71///     RenderHtml(key, engine, data)
72/// }
73/// ```
74#[derive(Debug, Clone, PartialEq, Eq)]
75#[must_use]
76pub struct RenderHtml<K, E, S>(pub K, pub E, pub S);
77
78impl<K, E, S> IntoResponse for RenderHtml<K, E, S>
79where
80    E: TemplateEngine,
81    S: Serialize,
82    K: AsRef<str>,
83{
84    fn into_response(self) -> axum::response::Response {
85        let RenderHtml(key, engine, data) = self;
86
87        let result = engine.render(key.as_ref(), data);
88
89        match result {
90            Ok(x) => Html(x).into_response(),
91            Err(x) => x.into_response(),
92        }
93    }
94}
95
96impl<K, E, S> From<Render<K, E, S>> for RenderHtml<K, E, S> {
97    fn from(r: Render<K, E, S>) -> Self {
98        let Render(a, b, c) = r;
99        Self(a, b, c)
100    }
101}
102
103impl<K, E, S> From<RenderHtml<K, E, S>> for Render<K, E, S> {
104    fn from(r: RenderHtml<K, E, S>) -> Self {
105        let RenderHtml(a, b, c) = r;
106        Self(a, b, c)
107    }
108}
109
110impl<K, E, S> From<(K, E, S)> for Render<K, E, S> {
111    fn from((k, e, s): (K, E, S)) -> Self {
112        Self(k, e, s)
113    }
114}
115
116impl<K, E, S> From<(K, E, S)> for RenderHtml<K, E, S> {
117    fn from((k, e, s): (K, E, S)) -> Self {
118        Self(k, e, s)
119    }
120}