Skip to main content

ddapi_rs/
error.rs

1use std::fmt;
2
3pub type Result<T> = std::result::Result<T, Error>;
4
5#[derive(Debug)]
6pub enum Error {
7    NotFound,
8    EmptyBody,
9    /// DDStats sometimes returns `{ "error": "..." }` with HTTP 200.
10    RemoteMessage(String),
11    Http(reqwest::Error),
12    HttpStatus {
13        status: reqwest::StatusCode,
14        body: String,
15    },
16    Json(serde_json::Error),
17}
18
19impl fmt::Display for Error {
20    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
21        match self {
22            Error::NotFound => write!(f, "Not found"),
23            Error::EmptyBody => write!(f, "Empty response body"),
24            Error::RemoteMessage(msg) => write!(f, "{msg}"),
25            Error::Http(e) => write!(f, "HTTP error: {e}"),
26            Error::HttpStatus { status, body } => write!(f, "HTTP status {status}: {body}"),
27            Error::Json(e) => write!(f, "JSON error: {e}"),
28        }
29    }
30}
31
32impl std::error::Error for Error {
33    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
34        match self {
35            Error::Http(e) => Some(e),
36            Error::Json(e) => Some(e),
37            _ => None,
38        }
39    }
40}
41
42impl From<reqwest::Error> for Error {
43    fn from(value: reqwest::Error) -> Self {
44        Error::Http(value)
45    }
46}
47
48impl From<serde_json::Error> for Error {
49    fn from(value: serde_json::Error) -> Self {
50        Error::Json(value)
51    }
52}