//! 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, );