axum-rh 0.2.8

A helper library for the axum router
Documentation
pub use axum::{
    http::{HeaderMap, HeaderName, HeaderValue, StatusCode},
    response::IntoResponse,
    Json,
};
use serde::Serialize;

use super::ResponseBody;

#[derive(Default)]
pub struct ApiResponse<T> {
    pub status: StatusCode,
    pub body: ResponseBody<T>,
    pub error: bool,
    pub headers: Option<HeaderMap>,
}

impl<T> ApiResponse<T>
where
    T: Serialize + Default,
{
    fn new(status: StatusCode, data: Option<T>) -> Self {
        Self {
            body: ResponseBody::<T> {
                data,
                ..Default::default()
            },
            status,
            ..Default::default()
        }
    }

    pub fn ok(data: Option<T>) -> Self {
        Self::new(StatusCode::OK, data)
    }

    pub fn created(data: Option<T>) -> Self {
        Self::new(StatusCode::CREATED, data)
    }

    fn error(status: StatusCode, error: &str) -> Self {
        Self {
            body: ResponseBody {
                error: error.to_string(),
                ..Default::default()
            },
            status,
            error: true,
            ..Default::default()
        }
    }

    pub fn not_found(error: &str) -> Self {
        Self::error(StatusCode::NOT_FOUND, error)
    }

    pub fn bad_request(error: &str) -> Self {
        Self::error(StatusCode::BAD_REQUEST, error)
    }
    pub fn unprocessable(error: &str) -> Self {
        Self::error(StatusCode::UNPROCESSABLE_ENTITY, error)
    }

    pub fn service_error(error: &str) -> Self {
        Self::error(StatusCode::FAILED_DEPENDENCY, error)
    }

    pub fn unauthorized(error: &str) -> Self {
        Self::error(StatusCode::UNAUTHORIZED, error)
    }
}

impl<T> IntoResponse for ApiResponse<T>
where
    T: Serialize + Default,
{
    fn into_response(self) -> axum::response::Response {
        (self.status, self.headers.unwrap_or_default(), self.body).into_response()
    }
}

impl<T> IntoResponse for ResponseBody<T>
where
    T: Serialize + Default,
{
    fn into_response(self) -> axum::response::Response {
        Json(self).into_response()
    }
}