use axum::response::IntoResponse; use reqwest::StatusCode; /// Central error type for infrastructure-layer failures. /// /// Each variant maps to an appropriate HTTP status code when converted /// into an Axum response. #[derive(thiserror::Error, Debug)] pub enum Error { #[error("{0}")] StateError(String), #[error("database error: {0}")] DatabaseError(String), #[error("configuration error: {0}")] ConfigError(String), #[error("IoError: {0}")] IoError(#[from] std::io::Error), } impl From for Error { fn from(err: mongodb::error::Error) -> Self { Self::DatabaseError(err.to_string()) } } impl IntoResponse for Error { fn into_response(self) -> axum::response::Response { let msg = self.to_string(); tracing::error!("Converting Error to Response: {msg}"); match self { Self::StateError(e) | Self::ConfigError(e) => { (StatusCode::INTERNAL_SERVER_ERROR, e).into_response() } Self::DatabaseError(e) => (StatusCode::SERVICE_UNAVAILABLE, e).into_response(), Self::IoError(_) => { (StatusCode::INTERNAL_SERVER_ERROR, "Unknown error").into_response() } } } }