#[derive(Debug)]
pub struct ApiError {
pub status_code: u16,
pub message: String,
pub code: String,
}
impl std::fmt::Display for ApiError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "HTTP {} — {} ({})", self.status_code, self.message, self.code)
}
}
impl std::error::Error for ApiError {}
#[derive(Debug, thiserror::Error)]
pub enum Error {
#[error("resource not found")]
NotFound,
#[error("unauthorized — check your API key")]
Unauthorized,
#[error("forbidden — leads limit reached")]
Forbidden,
#[error("rate limited")]
RateLimited {
retry_after: u64,
},
#[error("bad request: {0}")]
BadRequest(String),
#[error("API error: {0}")]
Api(#[from] ApiError),
#[error("network error: {0}")]
Network(#[from] reqwest::Error),
#[error("serialization error: {0}")]
Serde(#[from] serde_json::Error),
}