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}