use axum::{ http::StatusCode, response::{IntoResponse, Response}, Json, }; use crate::models::ErrorResponse; pub enum AppError { Unauthorized, NotFound(String), BadRequest(String), Internal(String, Option), } impl IntoResponse for AppError { fn into_response(self) -> Response { let (status, error_message, details) = match self { AppError::Unauthorized => (StatusCode::UNAUTHORIZED, "Unauthorized".to_string(), None), AppError::NotFound(msg) => (StatusCode::NOT_FOUND, msg, None), AppError::BadRequest(msg) => (StatusCode::BAD_REQUEST, msg, None), AppError::Internal(msg, details) => (StatusCode::INTERNAL_SERVER_ERROR, msg, details), }; let body = Json(ErrorResponse { error: error_message, details, }); (status, body).into_response() } } impl From for AppError where E: std::error::Error + Send + Sync + 'static, { fn from(err: E) -> Self { AppError::Internal("Internal Server Error".to_string(), Some(err.to_string())) } }