use axum::{ http::StatusCode, response::{IntoResponse, Response}, }; pub enum AppError { BadRequest, Conflict, Database(sqlx::Error), } impl From for AppError { fn from(e: sqlx::Error) -> Self { match e { sqlx::Error::Database(e) if e.is_unique_violation() => AppError::Conflict, 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 } } .into_response() } }