http-client-unix-domain-socket 0.1.1

A simple HTTP (json) client using UNIX domain socket in Rust
Documentation
use hyper::StatusCode;
#[cfg(feature = "json")]
use serde::de::DeserializeOwned;

/// Internal Error, wrapping other source of error.
#[derive(Debug)]
pub enum Error {
    SocketConnectionInitiation(std::io::Error),
    SocketConnectionClosed(Option<hyper::Error>),
    Handhsake(hyper::Error),
    RequestBuild(hyper::http::Error),
    RequestSend(hyper::Error),
    #[cfg(feature = "json")]
    RequestParsing(serde_json::Error),
    ResponseCollect(hyper::Error),
    #[cfg(feature = "json")]
    ResponseParsing(serde_json::Error),
}
impl std::fmt::Display for Error {
    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
        match self {
            Error::SocketConnectionInitiation(e) => {
                write!(f, "Failed to connect to unix stream, {}", e)
            }
            Error::SocketConnectionClosed(None) => {
                write!(f, "Unix stream was closed without any error.")
            }
            Error::SocketConnectionClosed(Some(e)) => {
                write!(f, "Unix stream was closed, {}", e)
            }
            Error::Handhsake(e) => {
                write!(f, "Failed to do HTTP 1.0 handshaking, {}", e)
            }
            Error::RequestBuild(e) => {
                write!(f, "Failed to build http request, {}", e)
            }
            Error::RequestSend(e) => {
                write!(f, "Failed to send http request, {}", e)
            }
            #[cfg(feature = "json")]
            Error::RequestParsing(e) => {
                write!(f, "Failed to parse http json request, {}", e)
            }
            Error::ResponseCollect(e) => {
                write!(f, "Failed to collect http request, {}", e)
            }
            #[cfg(feature = "json")]
            Error::ResponseParsing(e) => {
                write!(f, "Failed to parse http json response, {}", e)
            }
        }
    }
}
impl std::error::Error for Error {
    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
        match self {
            Error::SocketConnectionInitiation(error) => Some(error),
            Error::SocketConnectionClosed(Some(error)) => Some(error),
            Error::SocketConnectionClosed(None) => None,
            Error::Handhsake(error) => Some(error),
            Error::RequestBuild(error) => Some(error),
            Error::RequestSend(error) => Some(error),
            #[cfg(feature = "json")]
            Error::RequestParsing(error) => Some(error),
            Error::ResponseCollect(error) => Some(error),
            #[cfg(feature = "json")]
            Error::ResponseParsing(error) => Some(error),
        }
    }
}

/// Error used by [crate::ClientUnix::send_request] to be able to return unsuccessful HTTP error body.
#[derive(Debug)]
pub enum ErrorAndResponse {
    InternalError(Error),
    ResponseUnsuccessful(StatusCode, Vec<u8>),
}
impl std::fmt::Display for ErrorAndResponse {
    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
        match self {
            ErrorAndResponse::InternalError(e) => {
                write!(f, "Internal error, {}", e)
            }
            ErrorAndResponse::ResponseUnsuccessful(status_code, _) => {
                write!(
                    f,
                    "HTTP response was not successful, status code = {}",
                    status_code
                )
            }
        }
    }
}
impl std::error::Error for ErrorAndResponse {
    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
        match self {
            ErrorAndResponse::InternalError(error) => error.source(),
            ErrorAndResponse::ResponseUnsuccessful(_, _) => None,
        }
    }
}

/// Error used by [crate::ClientUnix::send_request_json] to be able to return unsuccessful HTTP error typed body **(feature = json)**.
#[cfg(feature = "json")]
#[derive(Debug)]
pub enum ErrorAndResponseJson<ERR: DeserializeOwned> {
    InternalError(Error),
    ResponseUnsuccessful(StatusCode, ERR),
}
#[cfg(feature = "json")]
impl<ERR: DeserializeOwned> std::fmt::Display for ErrorAndResponseJson<ERR> {
    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
        match self {
            ErrorAndResponseJson::InternalError(e) => {
                write!(f, "Internal error, {}", e)
            }
            ErrorAndResponseJson::ResponseUnsuccessful(status_code, _) => {
                write!(
                    f,
                    "HTTP response was not successful, status code = {}",
                    status_code
                )
            }
        }
    }
}
#[cfg(feature = "json")]
impl<ERR: DeserializeOwned + std::fmt::Debug> std::error::Error for ErrorAndResponseJson<ERR> {
    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
        match self {
            ErrorAndResponseJson::InternalError(error) => error.source(),
            ErrorAndResponseJson::ResponseUnsuccessful(_, _) => None,
        }
    }
}