1use std::error;
2use std::fmt;
3use std::fmt::Display;
4use std::io;
5use std::result;
6use std::string::FromUtf8Error;
7use uuid::Error as UUIDError;
8
9use crate::frame::frame_error::CDRSError;
10
11pub type Result<T> = result::Result<T, Error>;
12
13#[derive(Debug)]
19pub enum Error {
20 Io(io::Error),
22 UUIDParse(UUIDError),
24 General(String),
26 FromUtf8(FromUtf8Error),
28 Compression(String),
30 Server(CDRSError),
32}
33
34pub fn column_is_empty_err<T: Display>(column_name: T) -> Error {
35 Error::General(format!("Column or UDT property '{}' is empty", column_name))
36}
37
38impl fmt::Display for Error {
39 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
40 match *self {
41 Error::Io(ref err) => write!(f, "IO error: {}", err),
42 Error::Compression(ref err) => write!(f, "Compressor error: {}", err),
43 Error::Server(ref err) => write!(f, "Server error: {:?}", err.message),
44 Error::FromUtf8(ref err) => write!(f, "FromUtf8Error error: {:?}", err),
45 Error::UUIDParse(ref err) => write!(f, "UUIDParse error: {:?}", err),
46 Error::General(ref err) => write!(f, "GeneralParsing error: {:?}", err),
47 }
48 }
49}
50
51impl error::Error for Error {
52 fn description(&self) -> &str {
53 match *self {
54 Error::Io(ref err) => err.description(),
55 Error::Compression(ref err) => err.as_str(),
56 Error::Server(ref err) => err.message.as_str(),
57 Error::FromUtf8(ref err) => err.description(),
58 Error::UUIDParse(_) => "UUID Parse Error",
60 Error::General(ref err) => err.as_str(),
61 }
62 }
63}
64
65impl From<io::Error> for Error {
66 fn from(err: io::Error) -> Error {
67 Error::Io(err)
68 }
69}
70
71impl From<CDRSError> for Error {
72 fn from(err: CDRSError) -> Error {
73 Error::Server(err)
74 }
75}
76
77impl From<FromUtf8Error> for Error {
78 fn from(err: FromUtf8Error) -> Error {
79 Error::FromUtf8(err)
80 }
81}
82
83impl From<UUIDError> for Error {
84 fn from(err: UUIDError) -> Error {
85 Error::UUIDParse(err)
86 }
87}
88
89impl From<String> for Error {
90 fn from(err: String) -> Error {
91 Error::General(err)
92 }
93}
94
95impl<'a> From<&'a str> for Error {
96 fn from(err: &str) -> Error {
97 Error::General(err.to_string())
98 }
99}
100
101#[cfg(tests)]
102mod test {
103 use super::*;
104
105 #[test]
106 fn column_is_empty_err() {
107 let err = column_is_empty_err("some_column");
108
109 if let Error::General(err_description) = err {
110 assert_eq!(
111 err_description,
112 "Column or UDT property 'some_column' is empty"
113 );
114 return;
115 }
116
117 panic!("Unexpected result of column_is_empty_err, {:?}", err);
118 }
119
120 #[test]
121 fn error_display() {
122 }
124}