1use thiserror::Error;
2
3#[derive(Debug, Error)]
4pub enum WiError {
5 #[error("HTTP {status}: {message}")]
6 Api { status: u16, message: String, code: Option<String> },
7
8 #[error("request error: {0}")]
9 Request(#[from] reqwest::Error),
10
11 #[error("serialize error: {0}")]
12 Serialize(#[from] serde_json::Error),
13}
14
15impl WiError {
16 pub(crate) async fn from_response(res: reqwest::Response) -> WiError {
17 let status = res.status().as_u16();
18
19 #[derive(serde::Deserialize)]
20 struct Body {
21 message: Option<String>,
22 error: Option<String>,
23 code: Option<String>,
24 }
25
26 let message;
27 let code;
28
29 match res.json::<Body>().await {
30 Ok(b) => {
31 message = b.message.or(b.error).unwrap_or_else(|| format!("HTTP {status}"));
32 code = b.code;
33 }
34 Err(_) => {
35 message = format!("HTTP {status}");
36 code = None;
37 }
38 }
39
40 WiError::Api { status, message, code }
41 }
42}