use std::time::Duration;
use thiserror::Error;
#[derive(Debug, Error)]
pub enum UpstreamError {
#[error("upstream connect failed: {0}")]
ConnectFailed(String),
#[error("upstream timeout after {0:?}")]
Timeout(Duration),
#[error("upstream returned {status}: {body}")]
StatusError { status: u16, body: String },
#[error("upstream stream error: {0}")]
StreamError(String),
#[error("upstream returned an unparseable body: {0}")]
BadResponse(String),
#[error("upstream serialization error: {0}")]
SerializationError(String),
#[error("all upstream providers failed; last error: {0}")]
AllProvidersFailed(String),
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn status_error_display_shows_code_and_body() {
let e = UpstreamError::StatusError {
status: 503,
body: "service unavailable".into(),
};
let msg = e.to_string();
assert!(msg.contains("503"));
assert!(msg.contains("service unavailable"));
}
#[test]
fn timeout_display_uses_debug_format() {
let e = UpstreamError::Timeout(Duration::from_secs(5));
assert!(e.to_string().contains("5s"));
}
}