1use thiserror::Error;
4
5#[derive(Debug, Error)]
6pub enum ProviderError {
7 #[error("authentication failed for provider '{provider}': {message}")]
9 AuthError {
10 provider: &'static str,
11 message: String,
12 },
13
14 #[error("bad request to provider '{provider}': {message}")]
16 BadRequest {
17 provider: &'static str,
18 message: String,
19 },
20
21 #[error("rate limited by provider '{provider}'")]
23 RateLimited { provider: &'static str },
24
25 #[error("provider '{provider}' unavailable: {message}")]
27 Unavailable {
28 provider: &'static str,
29 message: String,
30 },
31
32 #[error("provider '{provider}' returned unparseable response: {message}")]
34 ParseError {
35 provider: &'static str,
36 message: String,
37 },
38
39 #[error("no API key configured for provider '{provider}'; set {env_var}")]
41 MissingApiKey {
42 provider: &'static str,
43 env_var: &'static str,
44 },
45
46 #[error("provider error: {0}")]
48 Other(#[from] anyhow::Error),
49}
50
51impl ProviderError {
52 pub fn is_retryable(&self) -> bool {
54 matches!(self, Self::RateLimited { .. } | Self::Unavailable { .. })
55 }
56}