1use serde::de;
2use std::fmt;
3
4#[derive(Debug)]
5pub enum Error {
6 Reqwest(reqwest::Error),
7 Server(String),
8 Client(String),
9 Serde(String),
10 Csv(csv::Error),
11 Json(serde_json::Error),
12 Io(std::io::Error),
13 Utf8(std::str::Utf8Error),
14}
15
16impl fmt::Display for Error {
17 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
18 match *self {
19 Error::Reqwest(ref err) => write!(f, "Reqwest error: {}", err),
20 Error::Server(ref s) => write!(f, "Server error: {}", s),
21 Error::Client(ref s) => write!(f, "Client error: {}", s),
22 Error::Serde(ref s) => write!(f, "Serde error: {}", s),
23 Error::Csv(ref err) => write!(f, "Csv error: {}", err),
24 Error::Json(ref err) => write!(f, "Json error: {}", err),
25 Error::Io(ref err) => write!(f, "Io error: {}", err),
26 Error::Utf8(ref err) => write!(f, "Utf8 error: {}", err),
27 }
28 }
29}
30
31impl std::error::Error for Error {
32 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
33 match *self {
34 Error::Reqwest(ref err) => Some(err),
35 Error::Server(..) => None,
36 Error::Client(..) => None,
37 Error::Serde(..) => None,
38 Error::Csv(ref err) => Some(err),
39 Error::Json(ref err) => Some(err),
40 Error::Io(ref err) => Some(err),
41 Error::Utf8(ref err) => Some(err),
42 }
43 }
44}
45
46impl From<reqwest::Error> for Error {
47 fn from(err: reqwest::Error) -> Error {
48 Error::Reqwest(err)
49 }
50}
51
52impl From<csv::Error> for Error {
53 fn from(err: csv::Error) -> Error {
54 Error::Csv(err)
55 }
56}
57
58impl From<serde_json::Error> for Error {
59 fn from(err: serde_json::Error) -> Error {
60 Error::Json(err)
61 }
62}
63
64impl From<std::io::Error> for Error {
65 fn from(err: std::io::Error) -> Error {
66 Error::Io(err)
67 }
68}
69
70impl From<std::string::FromUtf8Error> for Error {
71 fn from(err: std::string::FromUtf8Error) -> Error {
72 Error::Utf8(err.utf8_error())
73 }
74}
75
76impl From<std::num::ParseIntError> for Error {
77 fn from(err: std::num::ParseIntError) -> Error {
78 Error::Server(format!("{}", err))
79 }
80}
81
82impl de::Error for Error {
85 fn custom<T>(msg: T) -> Self
86 where
87 T: fmt::Display,
88 {
89 Error::Serde(format!("{}", msg))
90 }
91}