use std::error;
use std::io;
use std::fmt;
use std::result;
use hyper;
use openssl;
use url;
#[derive(Debug)]
pub enum Error {
HyperError(hyper::error::Error),
InvalidProxyValue(String),
IO(io::Error),
SslError(openssl::error::Error),
UrlParseError(url::ParseError),
}
pub type Result<T> = result::Result<T, Error>;
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let msg = match *self {
Error::HyperError(ref err) => format!("{}", err),
Error::IO(ref e) => format!("{}", e),
Error::InvalidProxyValue(ref e) => format!("Invalid proxy value: {:?}", e),
Error::SslError(ref e) => format!("{}", e),
Error::UrlParseError(ref e) => format!("{}", e),
};
write!(f, "{}", msg)
}
}
impl error::Error for Error {
fn description(&self) -> &str {
match *self {
Error::HyperError(ref err) => err.description(),
Error::IO(ref err) => err.description(),
Error::InvalidProxyValue(_) => "Invalid proxy value",
Error::SslError(ref err) => err.description(),
Error::UrlParseError(ref err) => err.description(),
}
}
}
impl From<hyper::error::Error> for Error {
fn from(err: hyper::error::Error) -> Error {
Error::HyperError(err)
}
}
impl From<io::Error> for Error {
fn from(err: io::Error) -> Error {
Error::IO(err)
}
}
impl From<openssl::error::Error> for Error {
fn from(err: openssl::error::Error) -> Error {
Error::SslError(err)
}
}
impl From<url::ParseError> for Error {
fn from(err: url::ParseError) -> Self {
Error::UrlParseError(err)
}
}