use std::convert::Infallible; use axum::{ body::{Bytes, Full}, response::IntoResponse, Json, }; use reqwest::StatusCode; use super::models::ErrorResponse; use crate::error::APIError; impl ErrorResponse { fn new(status: StatusCode, message: Option) -> Self { let reason = status.canonical_reason().unwrap_or_default(); Self { status, error: message.unwrap_or_else(|| reason.to_string()), } } } impl IntoResponse for APIError { type Body = Full; type BodyError = Infallible; fn into_response(self) -> axum::http::Response { let res = match self { APIError::Sql(err) => match err { sqlx::Error::RowNotFound => ErrorResponse::new(StatusCode::NOT_FOUND, None), _ => ErrorResponse::new(StatusCode::INTERNAL_SERVER_ERROR, None), }, APIError::Multipart(_) => ErrorResponse::new(StatusCode::INTERNAL_SERVER_ERROR, None), APIError::BadRequest(err) => ErrorResponse::new(StatusCode::BAD_REQUEST, Some(err)), APIError::Unauthorized(err) => ErrorResponse::new(StatusCode::UNAUTHORIZED, Some(err)), APIError::Forbidden(err) => ErrorResponse::new(StatusCode::FORBIDDEN, Some(err)), APIError::NotFound(err) => ErrorResponse::new(StatusCode::NOT_FOUND, Some(err)), APIError::Internal(err) => ErrorResponse::new(StatusCode::INTERNAL_SERVER_ERROR, Some(err)), APIError::Service(_) => ErrorResponse::new(StatusCode::INTERNAL_SERVER_ERROR, None), APIError::Query(_) => ErrorResponse::new(StatusCode::BAD_REQUEST, None), APIError::Decode(_) => ErrorResponse::new(StatusCode::BAD_REQUEST, None), }; let status = res.status; (status, Json(res)).into_response() } }