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}