ai_lib/types/
error.rs

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    /// Determine if the error is retryable
36    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                // Check if it's a temporary network error
43                transport_err.to_string().contains("timeout") ||
44                transport_err.to_string().contains("connection")
45            },
46            _ => false,
47        }
48    }
49    
50    /// Get suggested retry delay (milliseconds)
51    pub fn retry_delay_ms(&self) -> u64 {
52        match self {
53            AiLibError::RateLimitExceeded(_) => 60000, // 1 minute
54            AiLibError::NetworkError(_) => 1000,       // 1 second
55            AiLibError::TimeoutError(_) => 2000,       // 2 seconds
56            _ => 1000,
57        }
58    }
59}