Documentation
use std::{io::Error as StdIoError, net::AddrParseError as StdNetAddrParseError};

use http::uri::InvalidUri as HttpUriInvalidUri;
use tonic::Status as TonicStatus;
#[cfg(feature = "tonic-transport")]
use tonic::transport::Error as TonicTransportError;

#[derive(Debug, thiserror::Error)]
pub enum Error {
    #[error(transparent)]
    StdIoError(#[from] StdIoError),

    #[error(transparent)]
    StdNetAddrParseError(#[from] StdNetAddrParseError),

    #[error(transparent)]
    HttpUriInvalidUri(#[from] HttpUriInvalidUri),

    #[error(transparent)]
    TonicStatus(#[from] TonicStatus),

    #[cfg(feature = "tonic-transport")]
    #[error(transparent)]
    TonicTransportError(#[from] TonicTransportError),

    #[error("{0}")]
    Generic(String),
}

#[macro_export]
macro_rules! err {
    ($($arg:tt)*) => {
        Err($crate::error::Error::Generic(format!($($arg)*)))
    }
}

#[allow(unused_imports)]
pub(crate) use err;

pub type Result<T, E = Error> = std::result::Result<T, E>;