use std::time::Duration;
use thiserror::Error;
#[derive(Debug, Error)]
pub enum Error {
#[error("authentication failed: {0}")]
Authentication(String),
#[error("not found: {0}")]
NotFound(String),
#[error("validation failed: {message}")]
Validation {
code: String,
message: String,
details: Option<serde_json::Value>,
},
#[error("rate limited: {message} (retry after {retry_after:?})")]
RateLimit {
code: String,
message: String,
retry_after: Option<Duration>,
},
#[error("api error {status}: {message} (code={code})")]
Api {
status: u16,
code: String,
message: String,
details: Option<serde_json::Value>,
},
#[error("network error: {0}")]
Network(#[from] reqwest::Error),
#[error("decode error: {0}")]
Decode(#[from] serde_json::Error),
}
impl Error {
pub fn is_retryable(&self) -> bool {
match self {
Error::Network(_) | Error::RateLimit { .. } => true,
Error::Api { status, .. } => *status >= 500,
_ => false,
}
}
}