use crate::{
ByteArray, DecodeError, DecodePacket, EncodeError, EncodePacket, FixedHeader, Packet, PacketId,
PacketType, VarIntError,
};
#[allow(clippy::module_name_repetitions)]
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct PublishReleasePacket {
packet_id: PacketId,
}
impl PublishReleasePacket {
#[must_use]
pub const fn new(packet_id: PacketId) -> Self {
Self { packet_id }
}
#[must_use]
#[inline]
pub const fn packet_id(&self) -> PacketId {
self.packet_id
}
}
impl DecodePacket for PublishReleasePacket {
fn decode(ba: &mut ByteArray) -> Result<Self, DecodeError> {
let fixed_header = FixedHeader::decode(ba)?;
if fixed_header.packet_type() != PacketType::PublishRelease {
Err(DecodeError::InvalidPacketType)
} else if fixed_header.remaining_length() != PacketId::bytes() {
Err(DecodeError::InvalidRemainingLength)
} else {
let packet_id = PacketId::decode(ba)?;
Ok(Self { packet_id })
}
}
}
impl EncodePacket for PublishReleasePacket {
fn encode(&self, buf: &mut Vec<u8>) -> Result<usize, EncodeError> {
let old_len = buf.len();
let fixed_header = FixedHeader::new(PacketType::PublishRelease, PacketId::bytes())?;
fixed_header.encode(buf)?;
self.packet_id.encode(buf)?;
Ok(buf.len() - old_len)
}
}
impl Packet for PublishReleasePacket {
fn packet_type(&self) -> PacketType {
PacketType::PublishRelease
}
fn bytes(&self) -> Result<usize, VarIntError> {
let fixed_header = FixedHeader::new(PacketType::PublishRelease, PacketId::bytes())?;
Ok(fixed_header.bytes() + PacketId::bytes())
}
}