Skip to main content

wi_api/
error.rs

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}