use std::time::Duration;
use thiserror::Error;
#[derive(Error, Debug)]
pub enum AsterDexError {
#[error("API error {code}: {msg}")]
ApiError {
code: i64,
msg: String,
},
#[error("Rate limited, retry after: {retry_after:?}")]
RateLimited {
retry_after: Option<Duration>,
},
#[error("IP banned, retry after: {retry_after:?}")]
IpBanned {
retry_after: Option<Duration>,
},
#[error("HTTP error {status}: {body}")]
HttpError {
status: u16,
body: String,
},
#[error("Network error ({kind}): {message}")]
NetworkError {
kind: &'static str,
message: String,
},
#[error("Request timeout: {message}")]
Timeout {
message: String,
},
#[error("Invalid parameters: {message}")]
InvalidParams {
message: String,
},
#[error("WebSocket error: {message}")]
WebSocketError {
message: String,
},
#[error("Config error: {message}")]
ConfigError {
message: String,
},
#[error("Serde error: {message}")]
SerdeError {
message: String,
},
}
impl AsterDexError {
pub(crate) fn from_reqwest(e: reqwest::Error) -> Self {
if e.is_timeout() {
return AsterDexError::Timeout {
message: e.to_string(),
};
}
let kind = if e.is_connect() {
"connect"
} else if e.is_request() {
"request"
} else if e.is_body() {
"body"
} else if e.is_decode() {
"decode"
} else {
"other"
};
AsterDexError::NetworkError {
kind,
message: e.to_string(),
}
}
}