diff --git a/src/conn.rs b/src/conn.rs index 315468b..a566512 100644 --- a/src/conn.rs +++ b/src/conn.rs @@ -1,6 +1,6 @@ //! Basic connection between client and server. -use std::{error, fmt, result, time::Duration}; +use std::{fmt, time::Duration}; use futures_util::{SinkExt, StreamExt}; use jiff::Timestamp; @@ -11,56 +11,14 @@ use tokio::{ time::{self, Instant}, }; use tokio_tungstenite::{ - tungstenite::{self, client::IntoClientRequest, handshake::client::Response, Message}, + tungstenite::{client::IntoClientRequest, handshake::client::Response, Message}, MaybeTlsStream, WebSocketStream, }; -use crate::api::{Data, Packet, PacketType, ParsedPacket, Ping, PingEvent, PingReply, Time}; - -/// An error that can occur while using an [`EuphConn`]. -#[derive(Debug)] -pub enum Error { - /// The connection is closed. - ConnectionClosed, - - /// A ping was not replied to in time. - PingTimeout, - - /// A packet was not sent because it was malformed. - MalformedPacket(serde_json::Error), - - /// A malformed packet was received. - ReceivedMalformedPacket(serde_json::Error), - - /// A binary message was received. - ReceivedBinaryMessage, - - Tungstenite(tungstenite::Error), -} - -impl fmt::Display for Error { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - Self::ConnectionClosed => write!(f, "connection closed"), - Self::PingTimeout => write!(f, "ping timed out"), - Self::MalformedPacket(err) => write!(f, "malformed packet: {err}"), - Self::ReceivedMalformedPacket(err) => write!(f, "received malformed packet: {err}"), - Self::ReceivedBinaryMessage => write!(f, "received binary message"), - Self::Tungstenite(err) => write!(f, "{err}"), - } - } -} - -impl error::Error for Error {} - -impl From for Error { - fn from(err: tungstenite::Error) -> Self { - Self::Tungstenite(err) - } -} - -/// An alias of [`Result`](result::Result) for [`Error`]. -pub type Result = result::Result; +use crate::{ + api::{Data, Packet, PacketType, ParsedPacket, Ping, PingEvent, PingReply, Time}, + error::{Error, Result}, +}; /// Which side of the connection we're on. #[derive(Debug, Clone, Copy, PartialEq, Eq)] diff --git a/src/error.rs b/src/error.rs new file mode 100644 index 0000000..130160d --- /dev/null +++ b/src/error.rs @@ -0,0 +1,59 @@ +//! Error handling. + +use std::fmt; + +use tokio_tungstenite::tungstenite; + +use crate::api::PacketType; + +/// Possible euphoria communication errors. +#[derive(Debug)] +pub enum Error { + /// The connection is closed. + ConnectionClosed, + + /// A ping was not replied to in time. + PingTimeout, + + /// A packet was not sent because it was malformed. + MalformedPacket(serde_json::Error), + + /// A binary message was received. + ReceivedBinaryMessage, + + /// A malformed packet was received. + ReceivedMalformedPacket(serde_json::Error), + + /// An unexpected packet was received. + ReceivedUnexpectedPacket(PacketType), + + /// A tungstenite error. + Tungstenite(tungstenite::Error), +} + +impl fmt::Display for Error { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::ConnectionClosed => write!(f, "connection closed"), + Self::PingTimeout => write!(f, "ping timed out"), + Self::MalformedPacket(err) => write!(f, "malformed packet: {err}"), + Self::ReceivedBinaryMessage => write!(f, "received binary message"), + Self::ReceivedMalformedPacket(err) => write!(f, "received malformed packet: {err}"), + Self::ReceivedUnexpectedPacket(ptype) => { + write!(f, "received packet of unexpected type: {ptype}") + } + Self::Tungstenite(err) => write!(f, "{err}"), + } + } +} + +impl std::error::Error for Error {} + +impl From for Error { + fn from(err: tungstenite::Error) -> Self { + Self::Tungstenite(err) + } +} + +/// An alias of [`Result`](std::result::Result) for [`Error`]. +pub type Result = std::result::Result; diff --git a/src/lib.rs b/src/lib.rs index 77f35b8..457c7d0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,7 @@ pub mod api; pub mod conn; mod emoji; +pub mod error; pub mod nick; mod replies;