use thiserror::Error;
#[derive(Debug, Error)]
pub enum XError {
#[error("Authentication failed: {0}")]
AuthenticationFailed(String),
#[error("Rate limit exceeded. Retry after {retry_after:?} seconds")]
RateLimitExceeded {
retry_after: Option<u64>,
message: String,
},
#[error("Invalid request: {0}")]
InvalidRequest(String),
#[error("API error (status {code}): {message}")]
ApiError { code: u16, message: String },
#[error("Network error: {0}")]
NetworkError(#[from] reqwest::Error),
#[error("JSON error: {0}")]
JsonError(#[from] serde_json::Error),
#[error("OAuth error: {0}")]
OAuthError(String),
#[error("Unknown error: {0}")]
Unknown(String),
}
impl XError {
pub fn is_retryable(&self) -> bool {
matches!(
self,
XError::RateLimitExceeded { .. }
| XError::ApiError {
code: 500..=599,
..
}
| XError::NetworkError(_)
)
}
pub fn retry_after(&self) -> Option<u64> {
match self {
XError::RateLimitExceeded { retry_after, .. } => *retry_after,
_ => None,
}
}
}
pub type XResult<T> = Result<T, XError>;