1use axum::response::{Html, IntoResponse};
2use serde::Serialize;
3
4use crate::TemplateEngine;
5
6#[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#[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}