use super::*;
const FIXED_HEADER_LEN: usize = 5;
const PID_LEN: usize = 2;
#[derive(Debug, Clone, PartialEq)]
pub enum Packet<'a> {
Connect(Connect<'a>),
Connack(Connack),
Publish(Publish<'a>),
Puback(Pid),
Pubrec(Pid),
Pubrel(Pid),
Pubcomp(Pid),
Subscribe(Subscribe<'a>),
Suback(Suback<'a>),
Unsubscribe(Unsubscribe<'a>),
Unsuback(Pid),
Pingreq,
Pingresp,
Disconnect,
}
impl<'a> Packet<'a> {
pub fn get_type(&self) -> PacketType {
match self {
Packet::Connect(_) => PacketType::Connect,
Packet::Connack(_) => PacketType::Connack,
Packet::Publish(_) => PacketType::Publish,
Packet::Puback(_) => PacketType::Puback,
Packet::Pubrec(_) => PacketType::Pubrec,
Packet::Pubrel(_) => PacketType::Pubrel,
Packet::Pubcomp(_) => PacketType::Pubcomp,
Packet::Subscribe(_) => PacketType::Subscribe,
Packet::Suback(_) => PacketType::Suback,
Packet::Unsubscribe(_) => PacketType::Unsubscribe,
Packet::Unsuback(_) => PacketType::Unsuback,
Packet::Pingreq => PacketType::Pingreq,
Packet::Pingresp => PacketType::Pingresp,
Packet::Disconnect => PacketType::Disconnect,
}
}
pub fn len(&self) -> usize {
let variable_len = match self {
Packet::Connect(c) => c.len(),
Packet::Connack(_) => 2,
Packet::Publish(p) => p.len(),
Packet::Puback(_)
| Packet::Pubrec(_)
| Packet::Pubrel(_)
| Packet::Pubcomp(_)
| Packet::Unsuback(_) => PID_LEN,
Packet::Suback(_) => PID_LEN + 1,
Packet::Subscribe(s) => s.len(),
Packet::Unsubscribe(u) => u.len(),
Packet::Pingreq | Packet::Pingresp | Packet::Disconnect => 0,
};
FIXED_HEADER_LEN + variable_len
}
}
macro_rules! packet_from_borrowed {
($($t:ident),+) => {
$(
impl<'a> From<$t<'a>> for Packet<'a> {
fn from(p: $t<'a>) -> Self {
Packet::$t(p)
}
}
)+
}
}
macro_rules! packet_from {
($($t:ident),+) => {
$(
impl<'a> From<$t> for Packet<'a> {
fn from(p: $t) -> Self {
Packet::$t(p)
}
}
)+
}
}
packet_from_borrowed!(Suback, Connect, Publish, Subscribe, Unsubscribe);
packet_from!(Connack);
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
#[cfg_attr(feature = "defmt-impl", derive(defmt::Format))]
pub enum PacketType {
Connect,
Connack,
Publish,
Puback,
Pubrec,
Pubrel,
Pubcomp,
Subscribe,
Suback,
Unsubscribe,
Unsuback,
Pingreq,
Pingresp,
Disconnect,
}