use std::io;
use thiserror::Error;
#[derive(Debug, Error)]
#[non_exhaustive]
pub enum Error {
#[error("client disconnected ({0})")]
Disconnected(DisconnectReason),
#[error(transparent)]
Frame(#[from] FrameError),
#[error(transparent)]
Handshake(#[from] HandshakeError),
#[error("invalid configuration: {0}")]
Config(String),
#[error("io error: {0}")]
Io(#[from] io::Error),
#[error("connection task terminated unexpectedly")]
TaskFailed,
}
#[derive(Debug, Clone, Error)]
#[non_exhaustive]
pub enum DisconnectReason {
#[error("end of stream")]
Eof,
#[error("connection reset: {0:?}")]
Reset(io::ErrorKind),
#[error("disconnect requested by peer")]
Requested,
#[error("write side closed")]
WriteClosed,
}
#[derive(Debug, Error)]
#[non_exhaustive]
pub enum FrameError {
#[error("unknown message type {0}")]
UnknownMessageType(u16),
#[error("failed to decode message type {message_type}")]
Decode {
message_type: u16,
},
#[error("frame decryption failed")]
Decrypt,
#[error("malformed frame: {0}")]
Malformed(String),
}
#[derive(Debug, Error)]
#[non_exhaustive]
pub enum HandshakeError {
#[error("no data received")]
NoData,
#[error("invalid marker byte {0}")]
InvalidMarker(u8),
#[error("encryption protocol mismatch: {0}")]
EncryptionProtocolMismatch(&'static str),
#[error("malformed handshake frame")]
MalformedFrame,
#[error("Handshake MAC failure")]
MacFailure,
#[error("handshake crypto failure: {0}")]
Crypto(String),
#[error("peer disconnected during handshake")]
Aborted,
}