use anyhow::Error; use axum::http::StatusCode; use axum::response::{IntoResponse, Response}; // Use anyhow, define error and enable '?' // For a simplified example of using anyhow in axum check /examples/anyhow-error-response #[derive(Debug)] pub enum AppError { InternalServerError(Error), ForbiddenError(String), } // Tell axum how to convert `AppError` into a response. impl IntoResponse for AppError { fn into_response(self) -> Response { match self { Self::InternalServerError(err) => { tracing::error!("Application error: {}", err); (StatusCode::INTERNAL_SERVER_ERROR, "Something went wrong").into_response() } Self::ForbiddenError(client_message) => { tracing::info!("Forbidden: {}", client_message); (StatusCode::FORBIDDEN, client_message).into_response() } } } } // This enables using `?` on functions that return `Result<_, anyhow::Error>` to turn them into // `Result<_, AppError>`. That way you don't need to do that manually. impl From for AppError where E: Into, { fn from(err: E) -> Self { Self::InternalServerError(Into::::into(err)) } }