use std::error::Error as StdError;
use std::fmt;
pub type Result<T> = std::result::Result<T, Error>;
#[derive(Debug)]
pub enum Error {
Reqwest(reqwest::Error),
HeaderValue(reqwest::header::InvalidHeaderValue),
HeaderToStr(reqwest::header::ToStrError),
Json(serde_json::Error),
Io(std::io::Error),
ParseInt(std::num::ParseIntError),
InvalidResponse(&'static str, serde_json::Value),
Custom(String),
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
use self::Error::*;
match self {
Reqwest(ref e) => e.fmt(f),
HeaderValue(ref e) => e.fmt(f),
HeaderToStr(ref e) => e.fmt(f),
Json(ref e) => e.fmt(f),
Io(ref e) => e.fmt(f),
ParseInt(ref e) => e.fmt(f),
InvalidResponse(ref s, ref r) => {
write!(f, "Failed to parse expected \"{}\" field from Response: {}", s, r)
},
Custom(ref s) => write!(f, "{}", s),
}
}
}
impl StdError for Error {
fn description(&self) -> &str {
use self::Error::*;
match self {
Reqwest(ref e) => e.description(),
HeaderValue(ref e) => e.description(),
HeaderToStr(ref e) => e.description(),
Json(ref e) => e.description(),
Io(ref e) => e.description(),
ParseInt(ref e) => e.description(),
InvalidResponse(_, _) => "Failed to parse expected field from Response",
Custom(_) => "Custom error message",
}
}
fn source(&self) -> Option<&(dyn StdError + 'static)> {
use self::Error::*;
match self {
Reqwest(_) => None,
HeaderValue(ref e) => e.source(),
HeaderToStr(ref e) => e.source(),
Json(ref e) => e.source(),
Io(ref e) => e.source(),
ParseInt(ref e) => e.source(),
InvalidResponse(_, _) |
Custom(_) => None,
}
}
}
impl From<reqwest::Error> for Error {
fn from(e: reqwest::Error) -> Self {
Error::Reqwest(e)
}
}
impl From<reqwest::header::InvalidHeaderValue> for Error {
fn from(e: reqwest::header::InvalidHeaderValue) -> Self {
Error::HeaderValue(e)
}
}
impl From<reqwest::header::ToStrError> for Error {
fn from(e: reqwest::header::ToStrError) -> Self {
Error::HeaderToStr(e)
}
}
impl From<serde_json::Error> for Error {
fn from(e: serde_json::Error) -> Self {
Error::Json(e)
}
}
impl From<std::io::Error> for Error {
fn from(e: std::io::Error) -> Self {
Error::Io(e)
}
}
impl From<std::num::ParseIntError> for Error {
fn from(e: std::num::ParseIntError) -> Self {
Error::ParseInt(e)
}
}