use async_tungstenite::tungstenite::{self, protocol::CloseFrame};
use std::{error::Error, fmt::Display};
#[derive(Debug)]
pub enum ChatConnectError {
WebSocket(tungstenite::Error),
Serde(serde_json::Error),
SocketClosed,
}
impl From<tungstenite::Error> for ChatConnectError {
fn from(error: tungstenite::Error) -> Self {
Self::WebSocket(error)
}
}
impl From<serde_json::Error> for ChatConnectError {
fn from(error: serde_json::Error) -> Self {
Self::Serde(error)
}
}
impl Display for ChatConnectError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::WebSocket(e) => e.fmt(f),
Self::Serde(e) => e.fmt(f),
Self::SocketClosed => write!(f, "socket closed"),
}
}
}
impl Error for ChatConnectError {
fn source(&self) -> Option<&(dyn Error + 'static)> {
match self {
Self::WebSocket(e) => Some(e),
Self::Serde(e) => Some(e),
Self::SocketClosed => None,
}
}
}
#[derive(Debug)]
pub enum ChatMessageStreamError {
WebSocket(tungstenite::Error),
Serde(serde_json::Error),
SocketClosed(Option<CloseFrame<'static>>),
PingTimeout,
}
impl From<tungstenite::Error> for ChatMessageStreamError {
fn from(error: tungstenite::Error) -> Self {
Self::WebSocket(error)
}
}
impl From<serde_json::Error> for ChatMessageStreamError {
fn from(error: serde_json::Error) -> Self {
Self::Serde(error)
}
}
impl Display for ChatMessageStreamError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::WebSocket(e) => e.fmt(f),
Self::Serde(e) => e.fmt(f),
Self::SocketClosed(Some(frame)) => {
write!(f, "socket was closed: {}", frame)
}
Self::SocketClosed(None) => {
write!(f, "socket was closed")
}
Self::PingTimeout => {
write!(f, "server stopped responding to pings")
}
}
}
}
impl Error for ChatMessageStreamError {
fn source(&self) -> Option<&(dyn Error + 'static)> {
match self {
Self::WebSocket(e) => Some(e),
Self::Serde(e) => Some(e),
Self::SocketClosed(_) => None,
Self::PingTimeout => None,
}
}
}