1use std::error::Error;
2use std::fmt;
3
4#[derive(Debug)]
6pub enum EpicAPIError {
7 InvalidCredentials,
9 APIError(String),
11 NetworkError(reqwest::Error),
13 DeserializationError(String),
15 HttpError {
17 status: reqwest::StatusCode,
19 body: String,
21 },
22 InvalidParams,
24 Server,
26 FabTimeout,
28}
29
30impl fmt::Display for EpicAPIError {
31 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
32 match self {
33 EpicAPIError::InvalidCredentials => {
34 write!(f, "Invalid Credentials")
35 }
36 EpicAPIError::Server => {
37 write!(f, "Server Error")
38 }
39 EpicAPIError::APIError(e) => {
40 write!(f, "API Error: {}", e)
41 }
42 EpicAPIError::NetworkError(e) => {
43 write!(f, "Network Error: {}", e)
44 }
45 EpicAPIError::DeserializationError(e) => {
46 write!(f, "Deserialization Error: {}", e)
47 }
48 EpicAPIError::HttpError { status, body } => {
49 write!(f, "HTTP Error {}: {}", status, body)
50 }
51 EpicAPIError::InvalidParams => {
52 write!(f, "Invalid Input Parameters")
53 }
54 EpicAPIError::FabTimeout => {
55 write!(f, "Fab Timeout Error")
56 }
57 }
58 }
59}
60
61impl Error for EpicAPIError {
62 fn description(&self) -> &str {
63 match *self {
64 EpicAPIError::InvalidCredentials => "Invalid Credentials",
65 EpicAPIError::Server => "Server Error",
66 EpicAPIError::APIError(_) => "API Error",
67 EpicAPIError::NetworkError(_) => "Network Error",
68 EpicAPIError::DeserializationError(_) => "Deserialization Error",
69 EpicAPIError::HttpError { .. } => "HTTP Error",
70 EpicAPIError::InvalidParams => "Invalid Input Parameters",
71 EpicAPIError::FabTimeout => "Fab Timeout Error",
72 }
73 }
74}
75
76impl From<reqwest::Error> for EpicAPIError {
77 fn from(e: reqwest::Error) -> Self {
78 EpicAPIError::NetworkError(e)
79 }
80}
81
82#[cfg(test)]
83mod tests {
84 use super::*;
85 use std::error::Error;
86
87 #[test]
88 fn display_invalid_credentials() {
89 assert_eq!(
90 format!("{}", EpicAPIError::InvalidCredentials),
91 "Invalid Credentials"
92 );
93 }
94
95 #[test]
96 fn display_api_error() {
97 assert_eq!(
98 format!("{}", EpicAPIError::APIError("test".into())),
99 "API Error: test"
100 );
101 }
102
103 #[test]
104 fn display_network_error() {
105 let err = reqwest::blocking::Client::new()
106 .get("http://")
107 .send()
108 .unwrap_err();
109 let message = format!("{}", EpicAPIError::NetworkError(err));
110 assert!(message.starts_with("Network Error: "));
111 }
112
113 #[test]
114 fn display_deserialization_error() {
115 assert_eq!(
116 format!("{}", EpicAPIError::DeserializationError("test".into())),
117 "Deserialization Error: test"
118 );
119 }
120
121 #[test]
122 fn display_http_error() {
123 assert_eq!(
124 format!(
125 "{}",
126 EpicAPIError::HttpError {
127 status: reqwest::StatusCode::BAD_REQUEST,
128 body: "bad".to_string()
129 }
130 ),
131 "HTTP Error 400 Bad Request: bad"
132 );
133 }
134
135 #[test]
136 fn display_server() {
137 assert_eq!(format!("{}", EpicAPIError::Server), "Server Error");
138 }
139
140 #[test]
141 fn display_invalid_params() {
142 assert_eq!(
143 format!("{}", EpicAPIError::InvalidParams),
144 "Invalid Input Parameters"
145 );
146 }
147
148 #[test]
149 fn display_fab_timeout() {
150 assert_eq!(format!("{}", EpicAPIError::FabTimeout), "Fab Timeout Error");
151 }
152
153 #[test]
154 #[allow(deprecated)]
155 fn error_description() {
156 assert_eq!(
157 EpicAPIError::InvalidCredentials.description(),
158 "Invalid Credentials"
159 );
160 assert_eq!(EpicAPIError::Server.description(), "Server Error");
161 assert_eq!(
162 EpicAPIError::APIError("x".into()).description(),
163 "API Error"
164 );
165 let err = reqwest::blocking::Client::new()
166 .get("http://")
167 .send()
168 .unwrap_err();
169 assert_eq!(
170 EpicAPIError::NetworkError(err).description(),
171 "Network Error"
172 );
173 assert_eq!(
174 EpicAPIError::DeserializationError("x".into()).description(),
175 "Deserialization Error"
176 );
177 assert_eq!(
178 EpicAPIError::HttpError {
179 status: reqwest::StatusCode::INTERNAL_SERVER_ERROR,
180 body: "fail".into()
181 }
182 .description(),
183 "HTTP Error"
184 );
185 assert_eq!(
186 EpicAPIError::InvalidParams.description(),
187 "Invalid Input Parameters"
188 );
189 assert_eq!(EpicAPIError::FabTimeout.description(), "Fab Timeout Error");
190 }
191
192 #[test]
193 fn error_is_debug() {
194 let err = reqwest::blocking::Client::new()
195 .get("http://")
196 .send()
197 .unwrap_err();
198 let _ = format!("{:?}", EpicAPIError::NetworkError(err));
199 let _ = format!("{:?}", EpicAPIError::APIError("msg".into()));
200 }
201}