axum_responses 0.1.1

A Simple way to use Axum responses
Documentation

use crate::to_http_status;
use serde_json::{json, Value};

use axum::{
    
    Json, response::{
        IntoResponse, 
        Response as HttpResponse
    }, 
};

/// `AxumResponse` tipo de dato que representa una respuesta HTTP.
 
pub type AxumResponse = Result<Response, Response>;

/// `AxumResult` tipo de dato que representa una respuesta 
/// algún servicio en la API.
/// 
/// ### Parámetros
/// 
/// * `T`: Tipo de dato de la respuesta.
/// 
/// ### Ejemplo
/// Retorna un tipo T si la respuesta es exitosa, 
/// de lo contrario retorna un `ApiResponse` negativo, 
/// o sea una HttpResponse de error.
 
pub type AxumResult<T> = Result<T, Response>;

pub enum Response {
    
    /// `Standard` es una respuesta estándar.
    /// 
    /// ### Parámetros
    /// 
    /// * `u16`: Código de estado HTTP.
    /// * `&'static str`: Mensaje de la respuesta.
     
    Standard(u16, &'static str),

    /// `JsonData` es una respuesta que contiene datos.
    /// 
    /// ### Parámetros
    /// 
    /// * `u16`: Código de estado HTTP.
    /// * `&'static str`: Mensaje de la respuesta.
    /// * `&'static str`: Nombre | key del Value.
    /// * `Value`: Los datos de la respuesta.
    /// 
    /// ### Ejemplo
    /// 
    /// ```rust
    /// use axum_responses::http::Response;
    /// use axum_responses::ToJson;
    /// 
    /// use serde::{Serialize, Deserialize};
    /// use serde_json::Value;
    /// 
    /// #[derive(Serialize, Deserialize)]
    /// struct TestStruct {
    ///    field: String
    /// }
    /// 
    /// impl ToJson for TestStruct {}
    /// 
    /// let test_struct = TestStruct {
    ///     field: "value".to_string()
    /// };
    /// 
    /// let response = Response::JsonData(
    ///     200, "Success", "data", test_struct.to_json()
    /// );
    /// ```

    JsonData(u16, &'static str, &'static str, Value)
}

impl IntoResponse for Response {

    fn into_response(self) -> HttpResponse {
        
        match self {

            Response::Standard(status, message) => {

                let code = to_http_status(status);
                
                let data = json!({ 
                    "status": code.as_u16(), "message": message 
                });

                return (code, Json(data)).into_response()
            },

            Response::JsonData(status, message, data_name, data) => {

                let code = to_http_status(status);
                
                let data = json!({
                    "status": code.as_u16(), 
                    "message": message, data_name: data
                });

                return (code, Json(data)).into_response()
            }
        }
    }
}