use std::fmt;
#[derive(Debug, Clone, PartialEq)]
pub enum AiError {
Http {
status: Option<u16>,
message: String,
},
Sse { message: String },
Auth { message: String },
Abort { message: String },
Schema { message: String },
Provider { code: String, message: String },
Usage { message: String },
}
impl fmt::Display for AiError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
AiError::Http {
status: Some(s),
message,
} => {
write!(f, "http error {s}: {message}")
}
AiError::Http {
status: None,
message,
} => write!(f, "http error: {message}"),
AiError::Sse { message } => write!(f, "sse error: {message}"),
AiError::Auth { message } => write!(f, "auth error: {message}"),
AiError::Abort { message } => write!(f, "abort error: {message}"),
AiError::Schema { message } => write!(f, "schema error: {message}"),
AiError::Provider { code, message } => write!(f, "provider error [{code}]: {message}"),
AiError::Usage { message } => write!(f, "usage error: {message}"),
}
}
}
impl std::error::Error for AiError {}
impl AiError {
pub fn is_abort(&self) -> bool {
matches!(self, AiError::Abort { .. })
}
pub fn is_retryable(&self) -> bool {
match self {
AiError::Http {
status: Some(s), ..
} => matches!(*s, 408 | 409 | 429) || *s >= 500,
AiError::Http { status: None, .. } => true,
_ => false,
}
}
}