aineed_core/
error.rs

1use std::fmt;
2use std::io;
3use reqwest::StatusCode;
4
5#[derive(Debug)]
6pub enum AiNeedError {
7    IoError(io::Error),
8    ConfigError(String),
9    MissingApiKey {
10        provider: String,
11        endpoint: String,
12        quota_reset: Option<String>,
13    },
14    InvalidApiKey {
15        provider: String,
16        endpoint: String,
17        quota_reset: Option<String>,
18    },
19    QuotaExceeded {
20        provider: String,
21        endpoint: String,
22        quota_reset: Option<String>,
23    },
24    UnsupportedModel {
25        provider: String,
26        model: String,
27        supported_models: Vec<String>,
28    },
29    ApiError {
30        provider: String,
31        endpoint: String,
32        status: u16,
33        message: String,
34    },
35    RequestError {
36        status: StatusCode,
37        message: String,
38        details: Option<String>,
39    },
40}
41
42impl fmt::Display for AiNeedError {
43    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
44        match self {
45            AiNeedError::IoError(err) => write!(f, "IO error: {}", err),
46            AiNeedError::ConfigError(msg) => write!(f, "Configuration error: {}", msg),
47            AiNeedError::MissingApiKey { provider, endpoint, quota_reset } => {
48                write!(f, "Missing API key for {} ({})", provider, endpoint)?;
49                if let Some(reset) = quota_reset {
50                    write!(f, " - Quota resets at {}", reset)?;
51                }
52                Ok(())
53            },
54            AiNeedError::InvalidApiKey { provider, endpoint, quota_reset } => {
55                write!(f, "Invalid API key for {} ({})", provider, endpoint)?;
56                if let Some(reset) = quota_reset {
57                    write!(f, " - Quota resets at {}", reset)?;
58                }
59                Ok(())
60            },
61            AiNeedError::QuotaExceeded { provider, endpoint, quota_reset } => {
62                write!(f, "Quota exceeded for {} ({})", provider, endpoint)?;
63                if let Some(reset) = quota_reset {
64                    write!(f, " - Quota resets at {}", reset)?;
65                }
66                Ok(())
67            },
68            AiNeedError::UnsupportedModel { provider, model, supported_models } => {
69                write!(f, "Unsupported model '{}' for provider {}. Supported models: {}", 
70                    model, provider, supported_models.join(", "))
71            },
72            AiNeedError::ApiError { provider, endpoint, status, message } => {
73                write!(f, "API error from {} ({}): {} - {}", provider, endpoint, status, message)
74            },
75            AiNeedError::RequestError { status, message, details } => {
76                if let Some(detail) = details {
77                    write!(f, "Request error ({}): {} - {}", status, message, detail)
78                } else {
79                    write!(f, "Request error ({}): {}", status, message)
80                }
81            },
82        }
83    }
84}
85
86impl std::error::Error for AiNeedError {}
87
88impl From<io::Error> for AiNeedError {
89    fn from(err: io::Error) -> Self {
90        AiNeedError::IoError(err)
91    }
92}