1use thiserror::Error;
2use crate::transport::TransportError;
3
4#[derive(Error, Debug)]
5pub enum AiLibError {
6 #[error("Provider error: {0}")]
7 ProviderError(String),
8
9 #[error("Transport error: {0}")]
10 TransportError(#[from] TransportError),
11
12 #[error("Invalid request: {0}")]
13 InvalidRequest(String),
14
15 #[error("Rate limit exceeded: {0}")]
16 RateLimitExceeded(String),
17
18 #[error("Authentication failed: {0}")]
19 AuthenticationError(String),
20
21 #[error("Configuration error: {0}")]
22 ConfigurationError(String),
23
24 #[error("Network error: {0}")]
25 NetworkError(String),
26
27 #[error("Timeout error: {0}")]
28 TimeoutError(String),
29
30 #[error("Retry exhausted: {0}")]
31 RetryExhausted(String),
32}
33
34impl AiLibError {
35 pub fn is_retryable(&self) -> bool {
37 match self {
38 AiLibError::NetworkError(_) => true,
39 AiLibError::TimeoutError(_) => true,
40 AiLibError::RateLimitExceeded(_) => true,
41 AiLibError::TransportError(transport_err) => {
42 transport_err.to_string().contains("timeout") ||
44 transport_err.to_string().contains("connection")
45 },
46 _ => false,
47 }
48 }
49
50 pub fn retry_delay_ms(&self) -> u64 {
52 match self {
53 AiLibError::RateLimitExceeded(_) => 60000, AiLibError::NetworkError(_) => 1000, AiLibError::TimeoutError(_) => 2000, _ => 1000,
57 }
58 }
59}