1use std::error;
2use std::error::Error;
3use std::fmt;
4use std::io;
5use std::num;
6use std::str;
7use std::sync::mpsc;
8use types::{PubSubType, SenderType};
9
10#[derive(Debug, Clone)]
11pub enum ParsingError {
12 BadIdentifier(String),
13}
14
15impl fmt::Display for ParsingError {
16 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
17 match *self {
18 ParsingError::BadIdentifier(ref err) => write!(f, "Invalid identifer: {}", err),
19 }
20 }
21}
22
23impl error::Error for ParsingError {
24 fn description(&self) -> &str {
25 match *self {
26 ParsingError::BadIdentifier(ref err) => err,
27 }
28 }
29
30 fn cause(&self) -> Option<&error::Error> {
31 match *self {
32 ParsingError::BadIdentifier(ref _err) => Some(self),
33 }
34 }
35}
36
37#[derive(Debug)]
38pub enum RedisError {
39 Io(io::Error),
40 Utf8(str::Utf8Error),
41 ParseInt(num::ParseIntError),
42 Parse(ParsingError),
43 Response(String),
44 MpscRecv(mpsc::RecvError),
45 MpscSendBytes(mpsc::SendError<(SenderType, u32, Vec<u8>)>),
46 MpscSendPubSubBytes(mpsc::SendError<(PubSubType, u32, Vec<u8>)>),
47 MpscTryRecv(mpsc::TryRecvError),
48}
49
50impl Clone for RedisError {
51 fn clone(&self) -> RedisError {
52 match *self {
53 RedisError::Io(ref err) => RedisError::Io(io::Error::new(err.kind(), err.description())),
54 RedisError::Utf8(ref err) => RedisError::Utf8(err.clone()),
55 RedisError::ParseInt(ref err) => RedisError::ParseInt(err.clone()),
56 RedisError::Parse(ref err) => RedisError::Parse(err.clone()),
57 RedisError::Response(ref err) => RedisError::Response(err.clone()),
58 RedisError::MpscRecv(ref err) => RedisError::MpscRecv(err.clone()),
59 RedisError::MpscSendBytes(ref err) => RedisError::MpscSendBytes(err.clone()),
60 RedisError::MpscSendPubSubBytes(ref err) => RedisError::MpscSendPubSubBytes(err.clone()),
61 RedisError::MpscTryRecv(ref err) => RedisError::MpscTryRecv(err.clone()),
62 }
63 }
64}
65
66impl fmt::Display for RedisError {
67 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
68 match *self {
69 RedisError::Io(ref err) => write!(f, "IO error: {}", err),
70 RedisError::Utf8(ref err) => write!(f, "Utf8 error: {}", err),
71 RedisError::ParseInt(ref err) => write!(f, "Parse Int error: {}", err),
72 RedisError::Parse(ref err) => write!(f, "Parsing error: {}", err),
73 RedisError::Response(ref err) => write!(f, "Response error: {}", err),
74 RedisError::MpscRecv(ref err) => write!(f, "MpscRecv error: {}", err),
75 RedisError::MpscSendBytes(ref err) => write!(f, "MpscSendBytes error: {}", err),
76 RedisError::MpscSendPubSubBytes(ref err) => write!(f, "MpscSendPubSubBytes error: {}", err),
77 RedisError::MpscTryRecv(ref err) => write!(f, "MpscTryRecv error: {}", err),
78 }
79 }
80}
81
82impl error::Error for RedisError {
83 fn description(&self) -> &str {
84 match *self {
85 RedisError::Io(ref err) => err.description(),
86 RedisError::Utf8(ref err) => err.description(),
87 RedisError::ParseInt(ref err) => err.description(),
88 RedisError::Parse(ref err) => err.description(),
89 RedisError::Response(ref err) => err,
90 RedisError::MpscRecv(ref err) => err.description(),
91 RedisError::MpscSendBytes(ref err) => err.description(),
92 RedisError::MpscSendPubSubBytes(ref err) => err.description(),
93 RedisError::MpscTryRecv(ref err) => err.description(),
94 }
95 }
96
97 fn cause(&self) -> Option<&error::Error> {
98 match *self {
99 RedisError::Io(ref err) => Some(err),
100 RedisError::Utf8(ref err) => Some(err),
101 RedisError::ParseInt(ref err) => Some(err),
102 RedisError::Parse(ref err) => Some(err),
103 RedisError::Response(ref _err) => Some(self),
104 RedisError::MpscRecv(ref err) => Some(err),
105 RedisError::MpscSendBytes(ref err) => Some(err),
106 RedisError::MpscSendPubSubBytes(ref err) => Some(err),
107 RedisError::MpscTryRecv(ref err) => Some(err),
108 }
109 }
110}
111
112impl From<io::Error> for RedisError {
113 fn from(err: io::Error) -> RedisError {
114 RedisError::Io(err)
115 }
116}
117
118impl From<str::Utf8Error> for RedisError {
119 fn from(err: str::Utf8Error) -> RedisError {
120 RedisError::Utf8(err)
121 }
122}
123
124impl From<num::ParseIntError> for RedisError {
125 fn from(err: num::ParseIntError) -> RedisError {
126 RedisError::ParseInt(err)
127 }
128}
129
130impl From<ParsingError> for RedisError {
131 fn from(err: ParsingError) -> RedisError {
132 RedisError::Parse(err)
133 }
134}
135
136impl From<String> for RedisError {
137 fn from(err: String) -> RedisError {
138 RedisError::Response(err)
139 }
140}
141
142impl From<mpsc::RecvError> for RedisError {
143 fn from(err: mpsc::RecvError) -> RedisError {
144 RedisError::MpscRecv(err)
145 }
146}
147
148impl From<mpsc::SendError<(SenderType, u32, Vec<u8>)>> for RedisError {
149 fn from(err: mpsc::SendError<(SenderType, u32, Vec<u8>)>) -> RedisError {
150 RedisError::MpscSendBytes(err)
151 }
152}
153
154impl From<mpsc::SendError<(PubSubType, u32, Vec<u8>)>> for RedisError {
155 fn from(err: mpsc::SendError<(PubSubType, u32, Vec<u8>)>) -> RedisError {
156 RedisError::MpscSendPubSubBytes(err)
157 }
158}
159
160impl From<mpsc::TryRecvError> for RedisError {
161 fn from(err: mpsc::TryRecvError) -> RedisError {
162 RedisError::MpscTryRecv(err)
163 }
164}