use std::time::Duration;
#[derive(Debug, thiserror::Error)]
pub enum CodecError {
#[error("JSON serialization failed: {0}")]
Serialize(#[source] serde_json::Error),
#[error("JSON deserialization failed: {0}")]
Deserialize(#[source] serde_json::Error),
}
#[derive(Debug, thiserror::Error)]
#[error("{message}")]
pub struct BearerTokenError {
message: String,
#[source]
source: Option<Box<dyn std::error::Error + Send + Sync>>,
}
impl BearerTokenError {
pub fn new(message: impl Into<String>) -> Self {
Self {
message: message.into(),
source: None,
}
}
pub fn with_source(
message: impl Into<String>,
source: impl std::error::Error + Send + Sync + 'static,
) -> Self {
Self {
message: message.into(),
source: Some(Box::new(source)),
}
}
}
#[derive(Debug, thiserror::Error)]
pub enum ConnectError {
#[error("invalid transport configuration: {0}")]
Config(String),
#[error("failed to obtain bearer token: {0}")]
Auth(#[source] BearerTokenError),
#[error("DNS resolution failed: {0}")]
Dns(#[source] Box<dyn std::error::Error + Send + Sync>),
#[error("TLS handshake failed: {0}")]
Tls(#[source] Box<dyn std::error::Error + Send + Sync>),
#[error("connection timed out after {0:?}")]
Timeout(Duration),
#[error("WebSocket handshake rejected: {status}")]
Rejected { status: u16 },
#[error("WebSocket error: {0}")]
Ws(#[source] tokio_tungstenite::tungstenite::Error),
}
#[derive(Debug, thiserror::Error)]
pub enum SendError {
#[error("connection closed")]
Closed,
#[error("WebSocket send failed: {0}")]
Ws(#[source] tokio_tungstenite::tungstenite::Error),
}
#[derive(Debug, thiserror::Error)]
pub enum RecvError {
#[error("connection closed")]
Closed,
#[error("WebSocket receive failed: {0}")]
Ws(#[source] tokio_tungstenite::tungstenite::Error),
}
#[derive(Debug, thiserror::Error)]
pub enum SessionError {
#[error("setup failed: {0}")]
SetupFailed(String),
#[error("setup timed out after {0:?}")]
SetupTimeout(Duration),
#[error("API error: {0}")]
Api(String),
#[error("connection lost and reconnection failed after {attempts} attempts")]
ReconnectExhausted { attempts: u32 },
#[error("session closed")]
Closed,
#[error(transparent)]
Transport(#[from] SendError),
#[error(transparent)]
Codec(#[from] CodecError),
}