use std::error::Error;
use tokio::task::JoinError;
use tokio_tungstenite::tungstenite;
#[derive(thiserror::Error, Debug, Clone, PartialEq, Eq, Hash)]
#[error("the ws connection was closed")]
pub struct ConnectionClosedError;
#[derive(thiserror::Error, Debug)]
pub enum ConnectError {
#[error("websocket error: {0}")]
WebsocketError(#[from] tungstenite::Error),
#[error(transparent)]
Join(#[from] JoinError),
#[error(transparent)]
Ping(#[from] PingError),
#[error(transparent)]
UpdateTime(#[from] UpdateTimeError),
#[error(transparent)]
SendMessage(#[from] SendMessageError),
#[error(transparent)]
ReceiveMessage(#[from] ReceiveMessageError),
}
#[derive(thiserror::Error, Debug, Clone, PartialEq, Eq, Hash)]
pub enum PingError {
#[error(transparent)]
ConnectionClosed(#[from] ConnectionClosedError),
#[error("a pong response wasn't received within the timeout")]
PongTimeout,
}
#[derive(thiserror::Error, Debug, Clone, PartialEq, Eq, Hash)]
pub enum UpdateTimeError {
#[error(transparent)]
ConnectionClosed(#[from] ConnectionClosedError),
#[error("client time has overflowed")]
TimeOverflow,
}
#[derive(thiserror::Error, Debug)]
pub enum SendMessageError {
#[error(transparent)]
ConnectionClosed(#[from] ConnectionClosedError),
#[error(transparent)]
FailedSerializingJson(#[from] serde_json::Error),
#[error(transparent)]
FailedSerializingMsgPack(#[from] rmp_serde::encode::Error),
}
#[derive(thiserror::Error, Debug)]
pub enum ReceiveMessageError {
#[error(transparent)]
WebSocket(#[from] tungstenite::Error),
#[error(transparent)]
ConnectionClosed(#[from] ConnectionClosedError),
}
#[derive(thiserror::Error, Debug, Clone, PartialEq, Eq)]
pub enum IntoAddrError {
#[error("team number {0} is greater than 25599")]
InvalidTeamNumber(u16),
}
#[derive(thiserror::Error, Debug)]
pub enum ReconnectError {
#[error(transparent)]
Fatal(Box<dyn Error + Send + Sync>),
#[error(transparent)]
Nonfatal(Box<dyn Error + Send + Sync>),
}
impl From<ConnectError> for ReconnectError {
fn from(value: ConnectError) -> Self {
match value {
ConnectError::WebsocketError(tungstenite::Error::Io(error)) => Self::Fatal(error.into()),
err => Self::Nonfatal(err.into()),
}
}
}