use crate::api;
use std::error;
use std::fmt;
use std::io;
use std::string::FromUtf8Error;
#[derive(Debug)]
pub enum Error {
Http(api::requests::Error),
WebSocket(::tungstenite::Error),
Utf8(FromUtf8Error),
Url(::url::ParseError),
Json(::serde_json::Error),
Api(String),
Internal(String),
}
impl From<api::requests::Error> for Error {
fn from(err: api::requests::Error) -> Error {
Error::Http(err)
}
}
impl From<::url::ParseError> for Error {
fn from(err: ::url::ParseError) -> Error {
Error::Url(err)
}
}
impl From<::tungstenite::Error> for Error {
fn from(err: ::tungstenite::Error) -> Error {
Error::WebSocket(err)
}
}
impl From<::serde_json::Error> for Error {
fn from(err: ::serde_json::Error) -> Error {
Error::Json(err)
}
}
impl From<io::Error> for Error {
fn from(err: io::Error) -> Error {
Error::Internal(format!("{:?}", err))
}
}
impl From<FromUtf8Error> for Error {
fn from(err: FromUtf8Error) -> Error {
Error::Utf8(err)
}
}
impl From<api::rtm::StartError<api::requests::Error>> for Error {
fn from(err: api::rtm::StartError<api::requests::Error>) -> Error {
Error::Api(format!("rtm::StartError: {}", err))
}
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match *self {
Error::Http(ref e) => write!(f, "Http (reqwest) Error: {}", e),
Error::WebSocket(ref e) => write!(f, "Websocket Error: {}", e),
Error::Utf8(ref e) => write!(f, "Utf8 decode Error: {}", e),
Error::Url(ref e) => write!(f, "Url Error: {}", e),
Error::Json(ref e) => write!(f, "Json Error: {}", e),
Error::Api(ref st) => write!(f, "Slack Api Error: {}", st),
Error::Internal(ref st) => write!(f, "Internal Error: {}", st),
}
}
}
impl error::Error for Error {
fn source(&self) -> Option<&(dyn error::Error + 'static)> {
match *self {
Error::Http(ref e) => Some(e),
Error::WebSocket(ref e) => Some(e),
Error::Utf8(ref e) => Some(e),
Error::Url(ref e) => Some(e),
Error::Json(ref e) => Some(e),
Error::Api(_) | Error::Internal(_) => None,
}
}
}