1use std::time::Duration;
2
3use thiserror::Error;
4
5#[derive(Debug, Error)]
7pub enum ProviderError {
8 #[error("provider transport error: {0}")]
9 Transport(#[source] reqwest::Error),
10 #[error("retryable provider error: {message}")]
11 Retryable {
12 message: String,
13 delay: Option<Duration>,
14 },
15 #[error("provider does not support capability: {0}")]
16 UnsupportedCapability(String),
17 #[error("{message}", message = provider_http_error(.status, .body))]
18 Http {
19 status: reqwest::StatusCode,
20 body: String,
21 },
22 #[error("failed to decode provider response: {0}")]
23 Decode(#[source] reqwest::Error),
24 #[error("failed to serialize provider request: {0}")]
25 Serialize(#[source] serde_json::Error),
26 #[error("failed to deserialize provider payload: {0}")]
27 Deserialize(#[source] serde_json::Error),
28 #[error("invalid provider request: {0}")]
29 InvalidRequest(String),
30 #[error("invalid provider response: {0}")]
31 InvalidResponse(String),
32 #[error("malformed provider stream: {0}")]
33 MalformedStream(String),
34}
35
36fn provider_http_error(status: &reqwest::StatusCode, body: &str) -> String {
37 if body.trim().is_empty() {
38 format!("provider returned HTTP {status}")
39 } else {
40 format!("provider returned HTTP {status}: {body}")
41 }
42}