samey/src/error.rs
2025-04-13 23:13:51 -03:00

70 lines
2.3 KiB
Rust

use askama::Template;
use axum::{
http::StatusCode,
response::{Html, IntoResponse, Response},
};
#[derive(askama::Template)]
#[template(path = "pages/not_found.html")]
struct NotFoundTemplate;
#[derive(Debug, thiserror::Error)]
pub enum SameyError {
#[error("Integer conversion error: {0}")]
IntConversion(#[from] std::num::TryFromIntError),
#[error("IO error: {0}")]
IO(#[from] std::io::Error),
#[error("Task error: {0}")]
Join(#[from] tokio::task::JoinError),
#[error("Template render error: {0}")]
Render(#[from] askama::Error),
#[error("Database error: {0}")]
Database(#[from] sea_orm::error::DbErr),
#[error("File streaming error: {0}")]
Multipart(#[from] axum::extract::multipart::MultipartError),
#[error("Image error: {0}")]
Image(#[from] image::ImageError),
#[error("Not found")]
NotFound,
#[error("Authentication error: {0}")]
Authentication(String),
#[error("Not allowed")]
Forbidden,
#[error("Bad request: {0}")]
BadRequest(String),
#[error("Internal error: {0}")]
Other(String),
}
impl IntoResponse for SameyError {
fn into_response(self) -> Response {
println!("Server error - {}", &self);
match &self {
SameyError::IntConversion(_)
| SameyError::IO(_)
| SameyError::Join(_)
| SameyError::Render(_)
| SameyError::Database(_)
| SameyError::Image(_)
| SameyError::Other(_) => {
(StatusCode::INTERNAL_SERVER_ERROR, "Something went wrong!").into_response()
}
SameyError::Multipart(_) | SameyError::BadRequest(_) => {
(StatusCode::BAD_REQUEST, "Invalid request").into_response()
}
SameyError::NotFound => (
StatusCode::NOT_FOUND,
Html(
NotFoundTemplate {}
.render()
.expect("shouldn't fail to render NotFoundTemplate"),
),
)
.into_response(),
SameyError::Authentication(_) => {
(StatusCode::UNAUTHORIZED, "Not authorized").into_response()
}
SameyError::Forbidden => (StatusCode::FORBIDDEN, "Forbidden").into_response(),
}
}
}