#[cfg(feature = "axum")]
use axum::{
http::StatusCode,
response::{IntoResponse, Json, Response},
};
#[cfg(feature = "axum")]
use serde::Serialize;
#[cfg(feature = "axum")]
use crate::result::{ApiResult, ErrorCode};
#[cfg(feature = "axum")]
fn error_code_to_status(code: ErrorCode) -> StatusCode {
match code {
ErrorCode::Success => StatusCode::OK,
ErrorCode::BadRequest => StatusCode::BAD_REQUEST,
ErrorCode::Unauthorized => StatusCode::UNAUTHORIZED,
ErrorCode::Forbidden => StatusCode::FORBIDDEN,
ErrorCode::NotFound => StatusCode::NOT_FOUND,
ErrorCode::Conflict => StatusCode::CONFLICT,
ErrorCode::TooManyRequests => StatusCode::TOO_MANY_REQUESTS,
ErrorCode::ValidationError => StatusCode::UNPROCESSABLE_ENTITY,
ErrorCode::InternalError => StatusCode::INTERNAL_SERVER_ERROR,
ErrorCode::NotImplemented => StatusCode::NOT_IMPLEMENTED,
ErrorCode::BadGateway => StatusCode::BAD_GATEWAY,
ErrorCode::ServiceUnavailable => StatusCode::SERVICE_UNAVAILABLE,
}
}
#[cfg(feature = "axum")]
impl<T: Serialize> IntoResponse for ApiResult<T> {
fn into_response(self) -> Response {
let status = self
.code
.and_then(|code| ErrorCode::from_i32(code))
.map(error_code_to_status)
.unwrap_or_else(|| {
if self.success {
StatusCode::OK
} else {
StatusCode::INTERNAL_SERVER_ERROR
}
});
(status, Json(self)).into_response()
}
}