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, code) = match res.json::<Body>().await {
27 Ok(b) => (b.message.or(b.error).unwrap_or_else(|| format!("HTTP {status}")), b.code),
28 Err(_) => (format!("HTTP {status}"), None),
29 };
30
31 WiError::Api { status, message, code }
32 }
33}