Skip to main content

mentra_provider/
error.rs

1use std::time::Duration;
2
3use thiserror::Error;
4
5/// Errors returned by provider implementations and stream adapters.
6#[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}