steer_core/api/
error.rs

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}