use thiserror::Error;
pub type Result<T> = anyhow::Result<T, ZelloError>;
#[derive(Debug, Error)]
pub enum ZelloError {
#[error("Connection error: {0}")]
ConnectionError(String),
#[error("Authentication error: {0}")]
AuthenticationError(String),
#[error("Protocol error: {0}")]
ProtocolError(String),
#[error("Other error: {0}")]
Other(#[from] Box<dyn std::error::Error + Send + Sync>),
#[error("IO error: {0}")]
IoError(#[from] std::io::Error),
#[error("JSON error: {0}")]
JsonError(#[from] serde_json::Error),
#[error("WebSocket error: {0}")]
WebSocketError(#[from] Box<tokio_tungstenite::tungstenite::Error>),
#[error("Audio error: {0}")]
AudioError(String),
#[error("Client is not connected")]
NotConnected,
#[error("Configuration error: {0}")]
ConfigError(String),
#[error("Operation timed out")]
Timeout,
#[error("Channel error: {0}")]
ChannelError(String),
#[error("Unknown error: {0}")]
Unknown(String),
}
impl From<tokio_tungstenite::tungstenite::Error> for ZelloError {
fn from(err: tokio_tungstenite::tungstenite::Error) -> Self {
Self::WebSocketError(Box::new(err))
}
}
impl From<Box<dyn std::error::Error>> for ZelloError {
fn from(err: Box<dyn std::error::Error>) -> Self {
ZelloError::Other(format!("{err}").into())
}
}