pub(crate) mod core;
pub(crate) mod fragment;
pub(crate) mod frame;
pub use core::*;
pub(crate) use fragment::*;
pub(crate) use frame::*;
pub(crate) type FrameSn = u32;
pub(crate) type BatchSize = u16;
pub(crate) mod id {
pub(crate) const BITS: u32 = 5;
pub(crate) const MASK: u8 = !(u8::MAX << BITS);
pub(crate) const FRAME: u8 = 0b0;
pub(crate) const FRAGMENT: u8 = 0b1;
}
#[derive(Debug, PartialEq, Eq)]
pub(crate) enum MessageBody {
#[allow(dead_code)]
Frame(FrameHeader),
Fragment(FragmentHeader),
}
impl MessageBody {
#[cfg(test)]
pub(crate) fn rand() -> Self {
if rand::random_bool(0.5) {
Self::Frame(FrameHeader::rand())
} else {
Self::Fragment(FragmentHeader::rand())
}
}
}
#[derive(Debug, PartialEq, Eq)]
pub(crate) struct MessageHeader {
pub(crate) header: u8,
pub(crate) seq_num: SeqNum,
}
impl MessageHeader {
pub(crate) const fn new(qos: QoS, seq_num: SeqNum) -> Self {
Self {
header: qos.as_u8(),
seq_num,
}
}
pub(crate) const unsafe fn from_parts(header: u8, seq_num: SeqNum) -> Self {
Self { header, seq_num }
}
pub(crate) fn qos(&self) -> QoS {
unsafe { QoS::from_u8(self.header) }
}
#[cfg(test)]
pub(crate) fn rand() -> Self {
Self::new(QoS::rand(), SeqNum::rand())
}
}
#[derive(Debug, PartialEq, Eq)]
pub(crate) struct Message {
pub(crate) header: MessageHeader,
pub(crate) body: MessageBody,
}
impl Message {
pub(crate) const fn new(header: MessageHeader, body: MessageBody) -> Self {
Self { header, body }
}
#[cfg(test)]
pub(crate) fn rand() -> Self {
Self {
header: MessageHeader::rand(),
body: MessageBody::rand(),
}
}
}