use axum::{ http::StatusCode, response::{IntoResponse, Response}, }; pub enum AppError { BadRequest, Conflict, Database(sqlx::Error), NotFound, } impl From for AppError { fn from(e: sqlx::Error) -> Self { match e { sqlx::Error::Database(e) if e.is_unique_violation() => AppError::Conflict, sqlx::Error::RowNotFound => AppError::NotFound, e => AppError::Database(e), } } } impl IntoResponse for AppError { fn into_response(self) -> Response { match self { AppError::BadRequest => StatusCode::BAD_REQUEST, AppError::Conflict => StatusCode::CONFLICT, AppError::Database(e) => { tracing::error!("database error: {e}"); StatusCode::INTERNAL_SERVER_ERROR } AppError::NotFound => StatusCode::NOT_FOUND, } .into_response() } }