1use thiserror::Error;
2
3#[derive(Error, Debug)]
4pub enum ApiError {
5 #[error("Network error: {0}")]
6 Network(#[from] reqwest::Error),
7
8 #[error("Authentication failed: {details}")]
9 AuthenticationFailed { provider: String, details: String },
10
11 #[error("Auth error: {0}")]
12 AuthError(String),
13
14 #[error("Rate limited by {provider}: {details}")]
15 RateLimited { provider: String, details: String },
16
17 #[error("Invalid request to {provider}: {details}")]
18 InvalidRequest { provider: String, details: String },
19
20 #[error("{provider} server error (Status: {status_code}): {details}")]
21 ServerError {
22 provider: String,
23 status_code: u16,
24 details: String,
25 },
26
27 #[error("Request timed out for {provider}")]
28 Timeout { provider: String },
29
30 #[error("Request cancelled for {provider}")]
31 Cancelled { provider: String },
32
33 #[error("Failed to parse response from {provider}: {details}")]
34 ResponseParsingError { provider: String, details: String },
35
36 #[error("API returned no choices/candidates for {provider}")]
37 NoChoices { provider: String },
38
39 #[error("Request blocked by {provider}: {details}")]
40 RequestBlocked { provider: String, details: String },
41
42 #[error("Unknown API error from {provider}: {details}")]
43 Unknown { provider: String, details: String },
44
45 #[error("Configuration error: {0}")]
46 Configuration(String),
47}
48
49impl From<crate::error::Error> for ApiError {
50 fn from(err: crate::error::Error) -> Self {
51 match err {
52 crate::error::Error::Api(api_err) => api_err,
53 crate::error::Error::Configuration(msg) => ApiError::Configuration(msg),
54 other => ApiError::Unknown {
55 provider: "internal".to_string(),
56 details: format!("Unexpected internal error: {other}"),
57 },
58 }
59 }
60}