-use axum::http::StatusCode;+use askama::Template;+use axum::http::{StatusCode, header};~use axum::response::{IntoResponse, Response};~use thiserror::Error;~~~pub type Result<T> = std::result::Result<T, Error>;~+#[derive(Template)]+#[template(path = "error.html")]+struct ErrorTemplate {+ status: u16,+ kind: &'static str,+ message: String,+ base_url: String,+}+~impl IntoResponse for Error {~ fn into_response(self) -> Response {- let status = match &self {- Error::RepoNotFound(_) | Error::NotFound(_) => StatusCode::NOT_FOUND,- Error::BadRequest(_) => StatusCode::BAD_REQUEST,- Error::Io(_) | Error::GitCorrupt(_) => StatusCode::INTERNAL_SERVER_ERROR,+ let (status, kind) = match &self {+ Error::RepoNotFound(_) | Error::NotFound(_) => (StatusCode::NOT_FOUND, "Not Found"),+ Error::BadRequest(_) => (StatusCode::BAD_REQUEST, "Bad Request"),+ Error::Io(_) | Error::GitCorrupt(_) => {+ (StatusCode::INTERNAL_SERVER_ERROR, "Internal Server Error")+ }~ };- (status, self.to_string()).into_response()++ let tpl = ErrorTemplate {+ status: status.as_u16(),+ kind,+ message: self.to_string(),+ base_url: crate::base_url().to_string(),+ };++ match tpl.render() {+ Ok(html) => ([(header::CONTENT_TYPE, "text/html; charset=utf-8")], html).into_response(),+ Err(_) => (status, self.to_string()).into_response(),+ }~ }~}