quixutils 0.13.2

Common helpers and utils
Documentation
use http::Response as HttpResponse;
use http::StatusCode;
use tide::{response::{IntoResponse, Body}, Response};

use super::{ApiError, ErrorData};

impl<T: ErrorData> IntoResponse for ApiError<T> {
    fn into_response(self) -> Response {
        use self::ApiError::*;
        match self {
            UserError(d) => json(StatusCode::OK, d),
            BadRequest(o) => {
                if let Some(d) = o {
                    json(StatusCode::BAD_REQUEST, d)
                } else {
                    empty(StatusCode::BAD_REQUEST)
                }
            }
            UnprocessableEntity(o) => {
                if let Some(d) = o {
                    json(StatusCode::UNPROCESSABLE_ENTITY, d)
                } else {
                    empty(StatusCode::UNPROCESSABLE_ENTITY)
                }
            }
            TooManyRequests {
                retry_after_secs: r,
            } => {
                if let Some(t) = r {
                    HttpResponse::builder()
                        .status(StatusCode::TOO_MANY_REQUESTS)
                        .header("Retry-After", t.to_string())
                        .body(Body::empty())
                        .unwrap()
                } else {
                    empty(StatusCode::TOO_MANY_REQUESTS)
                }
            }
            Unauthorized => empty(StatusCode::UNAUTHORIZED),
            Forbidden => empty(StatusCode::FORBIDDEN),
            NotFound => empty(StatusCode::NOT_FOUND),
            BadGateway => empty(StatusCode::BAD_GATEWAY),
            GatewayTimeout => empty(StatusCode::GATEWAY_TIMEOUT),
            Internal { error: e } => {
                log::error!("{:?}", e);
                empty(StatusCode::INTERNAL_SERVER_ERROR)
            }
            Unknown => empty(StatusCode::INTERNAL_SERVER_ERROR),
        }
    }
}

fn empty(code: StatusCode) -> Response {
    HttpResponse::builder()
        .status(code)
        .body(Body::empty())
        .unwrap()
}

fn json<T: Send + serde::Serialize>(code: StatusCode, body: T) -> Response {
    let mut response = tide::response::json(body);
    *response.status_mut() = code;
    response
}