Skip to main content

egs_api/api/
error.rs

1use std::error::Error;
2use std::fmt;
3
4/// Error enum for the Epic API
5#[derive(Debug)]
6pub enum EpicAPIError {
7    /// Wrong credentials
8    InvalidCredentials,
9    /// API error - see the contents
10    APIError(String),
11    /// Network/transport error from reqwest
12    NetworkError(reqwest::Error),
13    /// Failed to deserialize response body
14    DeserializationError(String),
15    /// HTTP error with non-success status code
16    HttpError {
17        /// HTTP status code
18        status: reqwest::StatusCode,
19        /// Response body text
20        body: String,
21    },
22    /// Invalid parameters
23    InvalidParams,
24    /// Server error
25    Server,
26    /// FAB Timeout
27    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}