//! Askama template definitions for all HTML pages and fragments.
//!
//! Split by domain:
//! - `public`: forum directory, project, category, thread pages
//! - `partials`: reusable post item fragment
mod public;
mod partials;
pub use public::*;
use askama::Template;
use axum::{
http::StatusCode,
response::{Html, IntoResponse, Response},
};
/// CSRF token passed to templates; None when no session store is configured.
pub type CsrfTokenOption = Option;
/// Helper to convert any Askama template into an Axum response.
fn render_template(template: T) -> Response {
match template.render() {
Ok(html) => Html(html).into_response(),
Err(err) => {
tracing::error!(error = ?err, "template rendering error");
(StatusCode::INTERNAL_SERVER_ERROR, "Template error").into_response()
}
}
}
/// Implement `IntoResponse` for one or more Askama template structs.
macro_rules! impl_into_response {
($($T:ty),+ $(,)?) => {
$(
impl IntoResponse for $T {
fn into_response(self) -> Response {
render_template(self)
}
}
)+
};
}
impl_into_response!(
ForumDirectoryTemplate,
CommunityTemplate,
CategoryTemplate,
ThreadTemplate,
NewThreadTemplate,
EditThreadTemplate,
CommunitySettingsTemplate,
EditCategoryTemplate,
MembersTemplate,
UserProfileTemplate,
ModerationTemplate,
ModLogTemplate,
AdminDashboardTemplate,
TrackedThreadsTemplate,
TrackingInfoTemplate,
SearchResultsFragment,
Error404Template,
Error500Template,
);