use std::time::Duration;
#[derive(Debug, Clone, PartialEq)]
pub enum BinanceDataError {
RateLimited { retry_after: Option<Duration> },
Api { status: u16, message: String },
Http { message: String },
Deserialize { message: String, payload: String },
InvalidInput { message: String },
}
impl std::fmt::Display for BinanceDataError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
BinanceDataError::RateLimited { retry_after } => {
write!(f, "Binance rate limited")?;
if let Some(duration) = retry_after {
write!(f, " (retry after {:?})", duration)?;
}
Ok(())
}
BinanceDataError::Api { status, message } => {
write!(f, "Binance API error ({}): {}", status, message)
}
BinanceDataError::Http { message } => {
write!(f, "Binance HTTP error: {}", message)
}
BinanceDataError::Deserialize { message, payload } => {
let boundary = payload.floor_char_boundary(100);
let truncated = &payload[..boundary];
let ellipsis = if boundary < payload.len() { "..." } else { "" };
write!(
f,
"Binance deserialize error: {} (payload: {truncated}{ellipsis})",
message
)
}
BinanceDataError::InvalidInput { message } => {
write!(f, "Binance invalid input: {}", message)
}
}
}
}
impl std::error::Error for BinanceDataError {}
impl From<reqwest::Error> for BinanceDataError {
fn from(err: reqwest::Error) -> Self {
BinanceDataError::Http {
message: err.to_string(),
}
}
}