1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
pub use default_client::Error as TlsError;
pub use hyper::Error as HyperError;
pub use json::Error as JsonError;
pub use url::ParseError as UrlError;
use message::Disconnect;
use std::error::Error as StdError;
use std::fmt::{self, Display, Formatter};
use std::result;
use std::io;
use types::StatusCode;
#[allow(unreachable_patterns)]
#[derive(Debug)]
pub enum Error {
Gzip(io::Error),
Http(StatusCode),
Hyper(HyperError),
Url(UrlError),
Tls(TlsError),
}
#[derive(Debug)]
pub enum StreamError {
Disconnect(Disconnect),
Io(io::Error),
Json(JsonError),
}
pub type Result<T> = result::Result<T, Error>;
impl StdError for Error {
fn description(&self) -> &str {
use Error::*;
#[allow(unreachable_patterns)]
match *self {
Gzip(ref e) => e.description(),
Http(ref status) => status.canonical_reason().unwrap_or("<unknown status code>"),
Hyper(ref e) => e.description(),
Url(ref e) => e.description(),
Tls(ref e) => e.description(),
}
}
fn cause(&self) -> Option<&StdError> {
use Error::*;
#[allow(unreachable_patterns)]
match *self {
Gzip(ref e) => Some(e),
Http(_) => None,
Hyper(ref e) => Some(e),
Url(ref e) => Some(e),
Tls(ref e) => Some(e),
}
}
}
impl StdError for StreamError {
fn description(&self) -> &str {
use StreamError::*;
match *self {
Disconnect(ref d) => &d.reason,
Io(ref e) => e.description(),
Json(ref e) => e.description(),
}
}
fn cause(&self) -> Option<&StdError> {
use StreamError::*;
match *self {
Disconnect(_) => None,
Io(ref e) => Some(e),
Json(ref e) => Some(e),
}
}
}
impl Display for Error {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
use Error::*;
#[allow(unreachable_patterns)]
match *self {
Gzip(ref e) => Display::fmt(e, f),
Http(ref code) => Display::fmt(code, f),
Hyper(ref e) => Display::fmt(e, f),
Url(ref e) => Display::fmt(e, f),
Tls(ref e) => Display::fmt(e, f),
}
}
}
impl Display for StreamError {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
use StreamError::*;
match *self {
Disconnect(ref d) => Display::fmt(d, f),
Io(ref e) => Display::fmt(e, f),
Json(ref e) => Display::fmt(e, f),
}
}
}
impl From<JsonError> for StreamError {
fn from(e: JsonError) -> Self {
StreamError::Json(e)
}
}
impl From<StatusCode> for Error {
fn from(e: StatusCode) -> Self {
Error::Http(e)
}
}
impl From<TlsError> for Error {
fn from(e: TlsError) -> Self {
Error::Tls(e)
}
}
impl From<UrlError> for Error {
fn from(e: UrlError) -> Self {
Error::Url(e)
}
}
impl From<HyperError> for Error {
fn from(e: HyperError) -> Self {
Error::Hyper(e)
}
}
impl From<io::Error> for StreamError {
fn from(e: io::Error) -> Self {
StreamError::Io(e)
}
}