use crate::protocol::v5::reason::ReasonCode;
use crate::protocol::v5::util::{
ack, ack_decode_impl, ack_encode_impl, ack_properties, ack_properties_frame_impl,
};
use crate::protocol::{Flags, PacketType, traits};
fn validate_pubrec_reason_code(code: ReasonCode) -> bool {
matches!(
code.into(),
0 | 16 | 128 | 131 | 135 | 144 | 145 | 151 | 153
)
}
ack_properties!(PubRecProperties);
ack_properties_frame_impl!(PubRecProperties);
ack!(PubRec, PubRecProperties, validate_pubrec_reason_code);
ack_decode_impl!(
PubRec,
PacketType::PubRec,
Flags::default(),
validate_pubrec_reason_code
);
ack_encode_impl!(PubRec, PacketType::PubRec, Flags::default());
impl traits::PubRec for PubRec {}
#[cfg(test)]
mod tests {
use super::*;
use crate::codec::PacketCodec;
use crate::codec::{Decode, Encode};
use bytes::BytesMut;
use tokio_util::codec::Decoder;
#[test]
fn pubrec_decode() {
let mut codec = PacketCodec::new(None, None);
let data = &[
(PacketType::PubRec as u8) << 4, 0x04, 0x12, 0x34, 0x00, 0x00, ];
let mut stream = BytesMut::new();
stream.extend_from_slice(&data[..]);
let raw_packet = codec.decode(&mut stream).unwrap().unwrap();
let packet = PubRec::decode(raw_packet).unwrap();
assert_eq!(packet, PubRec::new(0x1234, ReasonCode::Success, None));
}
#[test]
fn pubrec_encode() {
let packet = PubRec::new(0x1234, ReasonCode::Success, None);
let mut stream = BytesMut::new();
packet.encode(&mut stream).unwrap();
assert_eq!(
stream,
vec![
(PacketType::PubRec as u8) << 4, 0x02, 0x12, 0x34, ]
);
}
}