Documentation
use {
    failure::Fail,
    std::{fmt, io::Error},
    tokio::sync::broadcast::error::RecvError,
};

#[derive(Debug)]
pub struct ClientError {
    pub value: PushClientErrorValue,
}

impl fmt::Display for ClientError {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        fmt::Display::fmt(&self.value, f)
    }
}

#[derive(Debug, Fail)]
pub enum PushClientErrorValue {
    #[fail(display = "receive error")]
    ReceiveError(RecvError),

    #[fail(display = "send error")]
    SendError,
    #[fail(display = "io error")]
    IOError(Error),
}

impl From<Error> for ClientError {
    fn from(error: Error) -> Self {
        ClientError {
            value: PushClientErrorValue::IOError(error),
        }
    }
}

impl From<RecvError> for ClientError {
    fn from(error: RecvError) -> Self {
        ClientError {
            value: PushClientErrorValue::ReceiveError(error),
        }
    }
}