#[derive(thiserror::Error, Debug)] pub enum Error { #[error("Database error: {0}")] Sqlx(#[from] sqlx::Error), #[error("Route not found: {0}")] RouteNotFound(axum::http::Uri), #[error("User not found")] UserNotFound, #[error("Invalid user token")] InvalidToken, #[error("User with that email already exists")] EmailExists, #[error("Invalid email: {0}")] EmailInvalid(#[from] email_address::Error), #[error("Failed to reach authentication server: {0}")] AuthRequest(#[from] axum::http::Error), #[error("Authentication error: {0}")] Auth(#[from] crate::auth::error::Error), } impl axum::response::IntoResponse for Error { fn into_response(self) -> axum::response::Response { use axum::http::StatusCode; let status = match self { Self::RouteNotFound(_) | Self::UserNotFound => StatusCode::NOT_FOUND, Self::EmailExists => StatusCode::CONFLICT, Self::EmailInvalid(_) => StatusCode::UNPROCESSABLE_ENTITY, Self::InvalidToken => StatusCode::UNAUTHORIZED, Self::AuthRequest(_) | Self::Sqlx(_) => StatusCode::INTERNAL_SERVER_ERROR, Self::Auth(err) => return err.into_response(), }; (status, self.to_string()).into_response() } }