libmaccas 0.46.0

McDonald's API Client
Documentation
use std::{error::Error, fmt::Display, num::ParseIntError};

use http::StatusCode;

#[derive(Debug)]
pub enum ClientError {
    RequestOrMiddlewareError(reqwest_middleware::Error),
    RequestError(reqwest::Error),
    Other(anyhow::Error),
}

impl From<anyhow::Error> for ClientError {
    fn from(e: anyhow::Error) -> Self {
        Self::Other(e)
    }
}

impl From<reqwest_middleware::Error> for ClientError {
    fn from(e: reqwest_middleware::Error) -> Self {
        Self::RequestOrMiddlewareError(e)
    }
}

impl From<reqwest::Error> for ClientError {
    fn from(e: reqwest::Error) -> Self {
        Self::RequestError(e)
    }
}

impl From<ParseIntError> for ClientError {
    fn from(e: ParseIntError) -> Self {
        Self::Other(e.into())
    }
}

impl ClientError {
    pub fn status(&self) -> Option<StatusCode> {
        match self {
            ClientError::RequestOrMiddlewareError(e) => match e {
                reqwest_middleware::Error::Middleware(_) => None,
                reqwest_middleware::Error::Reqwest(e) => e.status(),
            },
            ClientError::RequestError(e) => e.status(),
            ClientError::Other(_) => None,
        }
    }
}

impl Error for ClientError {
    fn source(&self) -> Option<&(dyn Error + 'static)> {
        match self {
            ClientError::RequestOrMiddlewareError(e) => Some(e),
            ClientError::RequestError(e) => Some(e),
            ClientError::Other(e) => e.source(),
        }
    }

    fn description(&self) -> &str {
        "description() is deprecated; use Display"
    }

    fn cause(&self) -> Option<&dyn Error> {
        self.source()
    }
}

impl Display for ClientError {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            ClientError::RequestOrMiddlewareError(e) => e.fmt(f),
            ClientError::RequestError(e) => e.fmt(f),
            ClientError::Other(e) => e.fmt(f),
        }
    }
}