use crate::{
client::raw::RawError,
eio::ErrorKind,
header::Reserved,
types::{MqttString, ReasonCode, TooLargeToEncode},
};
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum Error<'e> {
Network(ErrorKind),
Server,
Alloc,
AuthPacketReceived,
Disconnect {
reason: ReasonCode,
reason_string: Option<MqttString<'e>>,
server_reference: Option<MqttString<'e>>,
},
RecoveryRequired,
PacketIdentifierNotInFlight,
RepublishQoSNotMatching,
PacketIdentifierAwaitingPubcomp,
PacketMaximumLengthExceeded,
ServerMaximumPacketSizeExceeded,
InvalidTopicAlias,
SessionBuffer,
SendQuotaExceeded,
IllegalDisconnectSessionExpiryInterval,
}
impl Error<'_> {
#[must_use]
pub fn is_recoverable(&self) -> bool {
matches!(
self,
Self::PacketIdentifierNotInFlight
| Self::RepublishQoSNotMatching
| Self::PacketIdentifierAwaitingPubcomp
| Self::PacketMaximumLengthExceeded
| Self::ServerMaximumPacketSizeExceeded
| Self::InvalidTopicAlias
| Self::SessionBuffer
| Self::SendQuotaExceeded
| Self::IllegalDisconnectSessionExpiryInterval
)
}
}
impl From<Reserved> for Error<'_> {
fn from(_: Reserved) -> Self {
Self::Server
}
}
impl<B> From<RawError<B>> for Error<'_> {
fn from(e: RawError<B>) -> Self {
match e {
RawError::Disconnected => Self::RecoveryRequired,
RawError::Network(e) => Self::Network(e),
RawError::Alloc(_) => Self::Alloc,
RawError::Server => Self::Server,
}
}
}
impl From<TooLargeToEncode> for Error<'_> {
fn from(_: TooLargeToEncode) -> Self {
Self::PacketMaximumLengthExceeded
}
}