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,
}
}
}