anycms-core 0.4.2

A unified API response library supporting multiple Rust web frameworks
Documentation
#[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,
    }
}

/// Axum framework integration for ApiResult
#[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()
    }
}