use std::time::Duration;
use thiserror::Error;
#[derive(Debug, Error)]
pub enum Error {
#[error("authentication failed: {message}")]
Authentication {
message: String,
status: u16,
code: Option<String>,
},
#[error("insufficient credits: balance={balance}, required={required} ({message})")]
InsufficientCredits {
message: String,
status: u16,
code: Option<String>,
balance: i64,
required: i64,
},
#[error("invalid request: {message}")]
InvalidRequest {
message: String,
status: u16,
code: Option<String>,
},
#[error("rate limited (retry_after={retry_after:?}): {message}")]
RateLimit {
message: String,
status: u16,
code: Option<String>,
retry_after: Duration,
},
#[error("job failed: {reason} (job_id={job_id:?})")]
JobFailed {
job_id: Option<String>,
reason: String,
},
#[error("polling timed out after {elapsed:?} (job_id={job_id:?})")]
JobTimeout {
job_id: Option<String>,
elapsed: Duration,
},
#[error("server error {status}: {message}")]
Server {
message: String,
status: u16,
code: Option<String>,
},
#[error("network error: {message}")]
Network {
message: String,
#[source]
source: Option<Box<dyn std::error::Error + Send + Sync>>,
},
#[error("anakin: {0}")]
Other(String),
}
impl Error {
pub fn status(&self) -> u16 {
match self {
Error::Authentication { status, .. }
| Error::InsufficientCredits { status, .. }
| Error::InvalidRequest { status, .. }
| Error::RateLimit { status, .. }
| Error::Server { status, .. } => *status,
_ => 0,
}
}
pub fn code(&self) -> Option<&str> {
match self {
Error::Authentication { code, .. }
| Error::InsufficientCredits { code, .. }
| Error::InvalidRequest { code, .. }
| Error::RateLimit { code, .. }
| Error::Server { code, .. } => code.as_deref(),
_ => None,
}
}
}
pub type Result<T> = std::result::Result<T, Error>;