switchgear-service 0.1.0

Service layer and API implementations for Switchgear LNURL load balancer
Documentation
use crate::api::service::StatusCode;
use axum::http::{HeaderMap, HeaderValue};
use axum::response::{IntoResponse, Response};

pub struct JsonCrudResponse<T> {
    body: Option<T>,
    status: StatusCode,
    headers: HeaderMap,
}

impl<T> JsonCrudResponse<T> {
    pub fn ok(body: T, headers: HeaderMap) -> Self {
        Self {
            body: Some(body),
            status: StatusCode::OK,
            headers,
        }
    }

    pub fn created_location(location: HeaderValue) -> Self {
        Self {
            body: None,
            status: StatusCode::CREATED,
            headers: HeaderMap::from_iter(vec![(axum::http::header::LOCATION, location)]),
        }
    }

    pub fn created() -> Self {
        Self {
            body: None,
            status: StatusCode::CREATED,
            headers: Default::default(),
        }
    }

    pub fn no_content() -> Self {
        JsonCrudResponse {
            body: None,
            status: StatusCode::NO_CONTENT,
            headers: Default::default(),
        }
    }
}

impl<T> IntoResponse for JsonCrudResponse<T>
where
    axum::Json<T>: IntoResponse,
{
    fn into_response(self) -> Response {
        match self.body {
            None => (self.status, self.headers).into_response(),
            Some(body) => (self.status, self.headers, axum::Json(body)).into_response(),
        }
    }
}