1use crate::{
2 block_on, GenericPollBodyState, GenericPollPacket, GenericPollPacketState, PollHeader,
3};
4
5use super::{
6 Auth, Connack, Connect, Disconnect, ErrorV5, Header, Packet, PacketType, Puback, Pubcomp,
7 Publish, Pubrec, Pubrel, Suback, Subscribe, Unsuback, Unsubscribe,
8};
9
10impl PollHeader for Header {
11 type Error = ErrorV5;
12 type Packet = Packet;
13
14 fn new_with(hd: u8, remaining_len: u32) -> Result<Self, Self::Error>
15 where
16 Self: Sized,
17 {
18 Header::new_with(hd, remaining_len)
19 }
20
21 fn build_empty_packet(&self) -> Option<Self::Packet> {
22 let packet = match self.typ {
23 PacketType::Pingreq => Packet::Pingreq,
24 PacketType::Pingresp => Packet::Pingresp,
25 PacketType::Auth if self.remaining_len == 0 => Auth::new_success().into(),
26 PacketType::Disconnect if self.remaining_len == 0 => Disconnect::new_normal().into(),
27 _ => return None,
28 };
29 Some(packet)
30 }
31
32 fn block_decode(self, reader: &mut &[u8]) -> Result<Self::Packet, Self::Error> {
33 match self.typ {
34 PacketType::Connect => block_on(Connect::decode_async(reader, self)).map(Into::into),
35 PacketType::Connack => block_on(Connack::decode_async(reader, self)).map(Into::into),
36 PacketType::Publish => block_on(Publish::decode_async(reader, self)).map(Into::into),
37 PacketType::Puback => block_on(Puback::decode_async(reader, self)).map(Into::into),
38 PacketType::Pubrec => block_on(Pubrec::decode_async(reader, self)).map(Into::into),
39 PacketType::Pubrel => block_on(Pubrel::decode_async(reader, self)).map(Into::into),
40 PacketType::Pubcomp => block_on(Pubcomp::decode_async(reader, self)).map(Into::into),
41 PacketType::Subscribe => {
42 block_on(Subscribe::decode_async(reader, self)).map(Into::into)
43 }
44 PacketType::Suback => block_on(Suback::decode_async(reader, self)).map(Into::into),
45 PacketType::Unsubscribe => {
46 block_on(Unsubscribe::decode_async(reader, self)).map(Into::into)
47 }
48 PacketType::Unsuback => block_on(Unsuback::decode_async(reader, self)).map(Into::into),
49 PacketType::Disconnect => {
50 block_on(Disconnect::decode_async(reader, self)).map(Into::into)
51 }
52 PacketType::Auth => block_on(Auth::decode_async(reader, self)).map(Into::into),
53 PacketType::Pingreq | PacketType::Pingresp => unreachable!(),
54 }
55 }
56
57 fn remaining_len(&self) -> usize {
58 self.remaining_len as usize
59 }
60
61 fn is_eof_error(err: &Self::Error) -> bool {
62 err.is_eof()
63 }
64}
65
66pub type PollPacket<'a, T> = GenericPollPacket<'a, T, Header>;
67pub type PollPacketState = GenericPollPacketState<Header>;
68pub type PollBodyState = GenericPollBodyState<Header>;