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 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}