2025-04-25 02:47:48 +01:00
|
|
|
use askama::Template;
|
|
|
|
|
use axum::{
|
|
|
|
|
Router,
|
2026-02-28 20:32:46 -05:00
|
|
|
http::{HeaderValue, StatusCode, header},
|
2025-04-25 02:47:48 +01:00
|
|
|
response::{Html, IntoResponse, Response},
|
|
|
|
|
};
|
2025-05-01 18:46:30 +01:00
|
|
|
use conduwuit_service::state;
|
2026-02-28 20:32:46 -05:00
|
|
|
use tower_http::set_header::SetResponseHeaderLayer;
|
2025-04-25 02:47:48 +01:00
|
|
|
|
2026-02-28 20:32:46 -05:00
|
|
|
mod pages;
|
2025-04-25 02:47:48 +01:00
|
|
|
|
2026-02-28 20:32:46 -05:00
|
|
|
type State = state::State;
|
2026-02-13 09:58:35 -05:00
|
|
|
|
2025-04-25 02:47:48 +01:00
|
|
|
#[derive(Debug, thiserror::Error)]
|
|
|
|
|
enum WebError {
|
|
|
|
|
#[error("Failed to render template: {0}")]
|
|
|
|
|
Render(#[from] askama::Error),
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl IntoResponse for WebError {
|
|
|
|
|
fn into_response(self) -> Response {
|
|
|
|
|
#[derive(Debug, Template)]
|
|
|
|
|
#[template(path = "error.html.j2")]
|
2026-02-28 20:32:46 -05:00
|
|
|
struct Error {
|
2025-04-25 02:47:48 +01:00
|
|
|
err: WebError,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let status = match &self {
|
|
|
|
|
| Self::Render(_) => StatusCode::INTERNAL_SERVER_ERROR,
|
|
|
|
|
};
|
2026-02-28 20:32:46 -05:00
|
|
|
|
|
|
|
|
let tmpl = Error { err: self };
|
|
|
|
|
|
2025-04-25 02:47:48 +01:00
|
|
|
if let Ok(body) = tmpl.render() {
|
2026-02-28 20:32:46 -05:00
|
|
|
(status, Html(body)).into_response()
|
2025-04-25 02:47:48 +01:00
|
|
|
} else {
|
|
|
|
|
(status, "Something went wrong").into_response()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-02-28 20:32:46 -05:00
|
|
|
|
|
|
|
|
pub fn build() -> Router<state::State> {
|
|
|
|
|
#[allow(clippy::wildcard_imports)]
|
|
|
|
|
use pages::*;
|
|
|
|
|
|
|
|
|
|
Router::new()
|
|
|
|
|
.merge(index::build())
|
|
|
|
|
.merge(resources::build())
|
|
|
|
|
.layer(SetResponseHeaderLayer::if_not_present(
|
|
|
|
|
header::CONTENT_SECURITY_POLICY,
|
|
|
|
|
HeaderValue::from_static("default-src 'self'"),
|
|
|
|
|
))
|
|
|
|
|
}
|