Skip to main content

ai/
error.rs

1use reqwest::StatusCode;
2
3#[derive(thiserror::Error, Debug)]
4pub enum Error {
5    #[error(transparent)]
6    Http(#[from] reqwest::Error),
7
8    #[error(transparent)]
9    Json(#[from] serde_json::Error),
10
11    #[error(transparent)]
12    Io(#[from] std::io::Error),
13
14    #[error("invalid header value for {0}: {1}")]
15    InvalidHeaderValue(String, reqwest::header::InvalidHeaderValue),
16
17    #[error("No API key for provider: {0}")]
18    MissingApiKey(String),
19
20    #[error("unsupported api: {0}")]
21    UnsupportedApi(String),
22
23    #[error("provider {provider} does not support {capability}")]
24    UnsupportedCapability {
25        provider: String,
26        capability: &'static str,
27    },
28
29    #[error("provider returned HTTP {status}: {body}")]
30    ApiStatus { status: StatusCode, body: String },
31
32    #[error("provider error: {0}")]
33    Provider(String),
34
35    #[error("invalid provider response: {0}")]
36    InvalidProviderResponse(String),
37
38    #[error("{0}")]
39    Validation(String),
40
41    #[error("request was cancelled")]
42    Cancelled,
43
44    #[error("stream ended before producing a final assistant message")]
45    StreamClosed,
46}
47
48pub type Result<T> = std::result::Result<T, Error>;
49
50impl Error {
51    pub fn unsupported_capability(provider: impl Into<String>, capability: &'static str) -> Self {
52        Self::UnsupportedCapability {
53            provider: provider.into(),
54            capability,
55        }
56    }
57}