use std::{error, fmt, io};
use derive_more::{Display, From};
use ntex::util::Either;
use crate::types::QoS;
#[derive(Debug, Display)]
pub enum MqttError<E> {
#[display(fmt = "Service error")]
Service(E),
#[display(fmt = "Mqtt protocol error: {}", _0)]
Protocol(ProtocolError),
HandshakeTimeout,
#[display(fmt = "Peer is disconnected, error: {:?}", _0)]
Disconnected(Option<io::Error>),
#[display(fmt = "Server error: {}", _0)]
ServerError(&'static str),
}
impl<E: fmt::Debug> error::Error for MqttError<E> {}
#[derive(Debug, Display, From)]
pub enum ProtocolError {
#[display(fmt = "Decode error: {:?}", _0)]
Decode(DecodeError),
#[display(fmt = "Encode error: {:?}", _0)]
Encode(EncodeError),
#[display(fmt = "Unexpected packet {:?}, {}", _0, _1)]
Unexpected(u8, &'static str),
#[display(fmt = "Packet id of publish ack packet does not match of send publish packet")]
PacketIdMismatch,
#[display(fmt = "Max allowed QoS level is violated {:?}", _0)]
MaxQoSViolated(QoS),
#[display(fmt = "Topic alias is greater than max topic alias")]
MaxTopicAlias,
#[display(fmt = "Number of in-flight messages exceeded")]
ReceiveMaximumExceeded,
#[display(fmt = "Unknown topic alias")]
UnknownTopicAlias,
#[display(fmt = "Keep alive timeout")]
KeepAliveTimeout,
}
impl error::Error for ProtocolError {}
impl<E> From<ProtocolError> for MqttError<E> {
fn from(err: ProtocolError) -> Self {
MqttError::Protocol(err)
}
}
impl<E> From<io::Error> for MqttError<E> {
fn from(err: io::Error) -> Self {
MqttError::Disconnected(Some(err))
}
}
impl<E> From<Either<io::Error, io::Error>> for MqttError<E> {
fn from(err: Either<io::Error, io::Error>) -> Self {
MqttError::Disconnected(Some(err.into_inner()))
}
}
impl<E> From<Either<DecodeError, io::Error>> for MqttError<E> {
fn from(err: Either<DecodeError, io::Error>) -> Self {
match err {
Either::Left(err) => MqttError::Protocol(ProtocolError::Decode(err)),
Either::Right(err) => MqttError::Disconnected(Some(err)),
}
}
}
impl<E> From<Either<EncodeError, io::Error>> for MqttError<E> {
fn from(err: Either<EncodeError, io::Error>) -> Self {
match err {
Either::Left(err) => MqttError::Protocol(ProtocolError::Encode(err)),
Either::Right(err) => MqttError::Disconnected(Some(err)),
}
}
}
#[derive(Debug, Display, Copy, Clone, PartialEq, Eq, Hash)]
pub enum DecodeError {
InvalidProtocol,
InvalidLength,
MalformedPacket,
UnsupportedProtocolLevel,
ConnectReservedFlagSet,
ConnAckReservedFlagSet,
InvalidClientId,
UnsupportedPacketType,
PacketIdRequired,
MaxSizeExceeded,
Utf8Error,
}
impl error::Error for DecodeError {}
#[derive(Copy, Clone, Debug, Display, PartialEq, Eq, Hash)]
pub enum EncodeError {
InvalidLength,
MalformedPacket,
PacketIdRequired,
UnsupportedVersion,
}
impl error::Error for EncodeError {}
#[derive(Debug, Display, PartialEq, Eq, Copy, Clone)]
pub enum SendPacketError {
Encode(EncodeError),
#[display(fmt = "Provided packet id is in use")]
PacketIdInUse(u16),
#[display(fmt = "Peer disconnected")]
Disconnected,
}
impl error::Error for SendPacketError {}