sincere/
error.rs

1use std::error;
2use std::fmt;
3use std::io;
4use std::num::ParseIntError;
5use std::result;
6use std::string::FromUtf8Error;
7use std::sync::mpsc::TryRecvError;
8
9use httparse;
10use hyper;
11use serde_json;
12use url;
13
14pub type Result<T> = result::Result<T, Error>;
15
16#[derive(Debug)]
17pub enum Error {
18    IoError(io::Error),
19    JsonError(serde_json::Error),
20    ReceiveSocketError(TryRecvError),
21    FromUtf8Error(FromUtf8Error),
22    HttpParseError(httparse::Error),
23    ParseIntError(ParseIntError),
24    HyperError(hyper::Error),
25    UrlParseError(url::ParseError),
26    Error(String),
27}
28
29impl From<io::Error> for Error {
30    fn from(err: io::Error) -> Error {
31        Error::IoError(err)
32    }
33}
34
35impl From<serde_json::Error> for Error {
36    fn from(err: serde_json::Error) -> Self {
37        Error::JsonError(err)
38    }
39}
40
41impl From<FromUtf8Error> for Error {
42    fn from(err: FromUtf8Error) -> Self {
43        Error::FromUtf8Error(err)
44    }
45}
46
47impl From<ParseIntError> for Error {
48    fn from(err: ParseIntError) -> Self {
49        Error::ParseIntError(err)
50    }
51}
52
53impl From<httparse::Error> for Error {
54    fn from(err: httparse::Error) -> Self {
55        Error::HttpParseError(err)
56    }
57}
58
59impl From<hyper::Error> for Error {
60    fn from(err: hyper::Error) -> Self {
61        Error::HyperError(err)
62    }
63}
64
65impl From<url::ParseError> for Error {
66    fn from(err: url::ParseError) -> Self {
67        Error::UrlParseError(err)
68    }
69}
70
71impl fmt::Display for Error {
72    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
73        match *self {
74            Error::IoError(ref inner) => inner.fmt(fmt),
75            Error::JsonError(ref inner) => inner.fmt(fmt),
76            Error::ReceiveSocketError(ref inner) => inner.fmt(fmt),
77            Error::FromUtf8Error(ref inner) => inner.fmt(fmt),
78            Error::HttpParseError(ref inner) => inner.fmt(fmt),
79            Error::ParseIntError(ref inner) => inner.fmt(fmt),
80            Error::HyperError(ref inner) => inner.fmt(fmt),
81            Error::UrlParseError(ref inner) => inner.fmt(fmt),
82            Error::Error(ref inner) => inner.fmt(fmt),
83        }
84    }
85}
86
87impl error::Error for Error {
88    fn description(&self) -> &str {
89        match *self {
90            Error::IoError(ref err) => err.description(),
91            Error::JsonError(ref err) => err.description(),
92            Error::ReceiveSocketError(ref err) => err.description(),
93            Error::FromUtf8Error(ref err) => err.description(),
94            Error::HttpParseError(ref err) => err.description(),
95            Error::ParseIntError(ref err) => err.description(),
96            Error::HyperError(ref err) => err.description(),
97            Error::UrlParseError(ref err) => err.description(),
98            Error::Error(ref err) => err,
99        }
100    }
101
102    fn cause(&self) -> Option<&error::Error> {
103        match *self {
104            Error::IoError(ref err) => Some(err),
105            Error::JsonError(ref err) => Some(err),
106            Error::ReceiveSocketError(ref err) => Some(err),
107            Error::FromUtf8Error(ref err) => Some(err),
108            Error::HttpParseError(ref err) => Some(err),
109            Error::ParseIntError(ref err) => Some(err),
110            Error::HyperError(ref err) => Some(err),
111            Error::UrlParseError(ref err) => Some(err),
112            Error::Error(_) => None,
113        }
114    }
115}