use crate::transport;
#[derive(Debug)]
pub struct ErrorPlaceHolder;
impl transport::TransportError for ErrorPlaceHolder {
}
#[derive(Debug)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum MqttError<T> {
Transport(T),
Protocol(ProtocolError),
ConnectionRefused(ConnectReasonCode),
NotConnected,
BufferTooSmall,
Timeout,
}
impl<T: transport::TransportError> From<T> for MqttError<T> {
fn from(err: T) -> Self {
MqttError::Transport(err)
}
}
impl<T: transport::TransportError> MqttError<T> {
pub fn cast_transport_error<E: transport::TransportError>(
other: MqttError<E>,
) -> MqttError<T> {
match other {
MqttError::Protocol(p) => MqttError::Protocol(p),
MqttError::ConnectionRefused(c) => MqttError::ConnectionRefused(c),
MqttError::NotConnected => MqttError::NotConnected,
MqttError::BufferTooSmall => MqttError::BufferTooSmall,
MqttError::Timeout => MqttError::Timeout,
MqttError::Transport(_) => panic!("Cannot cast a transport error"),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
#[repr(u8)]
pub enum ConnectReasonCode {
Success = 0,
UnacceptableProtocolVersion = 1,
IdentifierRejected = 2,
ServerUnavailable = 3,
BadUserNameOrPassword = 4,
NotAuthorized = 5,
Other(u8),
}
impl From<u8> for ConnectReasonCode {
fn from(val: u8) -> Self {
match val {
0 => Self::Success,
1 => Self::UnacceptableProtocolVersion,
2 => Self::IdentifierRejected,
3 => Self::ServerUnavailable,
4 => Self::BadUserNameOrPassword,
5 => Self::NotAuthorized,
_ => Self::Other(val),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum ProtocolError {
InvalidPacketType(u8),
InvalidResponse,
MalformedPacket,
PayloadTooLarge,
InvalidUtf8String,
#[cfg(feature = "v5")]
TooManyProperties,
}