rust-mqtt 0.5.1

MQTT client for embedded and non-embedded environments
Documentation
use crate::{
    buffer::BufferProvider,
    eio::Read,
    header::FixedHeader,
    io::{
        err::{BodyReadError, ReadError},
        read::BodyReader,
    },
    packet::Packet,
    v5::property::AtMostOncePropertyError,
};

pub trait RxPacket<'p>: Packet + Sized {
    /// Receives a packet. Must check the fixed header for correctness.
    async fn receive<R: Read, B: BufferProvider<'p>>(
        header: &FixedHeader,
        reader: BodyReader<'_, 'p, R, B>,
    ) -> Result<Self, RxError<R::Error, B::ProvisionError>>;
}

#[derive(Debug)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum RxError<E, B> {
    Read(E),
    Buffer(B),

    UnexpectedEOF,

    MalformedPacket,
    ProtocolError,
    InvalidTopicName,
}

impl<E, B: core::fmt::Debug> From<BodyReadError<E, B>> for RxError<E, B> {
    fn from(e: BodyReadError<E, B>) -> Self {
        match e {
            BodyReadError::Read(e) => Self::Read(e),
            BodyReadError::Buffer(b) => Self::Buffer(b),
            BodyReadError::UnexpectedEOF => Self::UnexpectedEOF,
            BodyReadError::InsufficientRemainingLen => Self::MalformedPacket,
            BodyReadError::MalformedPacket => Self::MalformedPacket,
            BodyReadError::ProtocolError => Self::ProtocolError,
            BodyReadError::InvalidTopicName => Self::InvalidTopicName,
        }
    }
}
impl<E, B: core::fmt::Debug> From<ReadError<BodyReadError<E, B>>> for RxError<E, B> {
    fn from(e: ReadError<BodyReadError<E, B>>) -> Self {
        match e {
            ReadError::Read(e) => e.into(),
            ReadError::UnexpectedEOF => Self::UnexpectedEOF,
            ReadError::MalformedPacket => Self::MalformedPacket,
            ReadError::ProtocolError => Self::ProtocolError,
            ReadError::InvalidTopicName => Self::InvalidTopicName,
        }
    }
}
impl<E, B: core::fmt::Debug> From<ReadError<E>> for RxError<E, B> {
    fn from(e: ReadError<E>) -> Self {
        match e {
            ReadError::Read(e) => Self::Read(e),
            ReadError::UnexpectedEOF => Self::UnexpectedEOF,
            ReadError::MalformedPacket => Self::MalformedPacket,
            ReadError::ProtocolError => Self::ProtocolError,
            ReadError::InvalidTopicName => Self::InvalidTopicName,
        }
    }
}
impl<E, B: core::fmt::Debug> From<AtMostOncePropertyError<ReadError<BodyReadError<E, B>>>>
    for RxError<E, B>
{
    fn from(e: AtMostOncePropertyError<ReadError<BodyReadError<E, B>>>) -> Self {
        match e {
            AtMostOncePropertyError::Read(e) => e.into(),
            AtMostOncePropertyError::AlreadySet => Self::ProtocolError,
        }
    }
}