use super::{
fixed_header::{FixedHeader, FixedHeaderBuilder},
Decoder, Encoder,
};
use crate::error::ProtoError;
use crate::v4::{decoder, GeneralVariableHeader, VariableDecoder};
use bytes::{Buf, BufMut, Bytes, BytesMut};
#[derive(Debug)]
pub struct PubRec {
fixed_header: FixedHeader,
variable_header: GeneralVariableHeader,
}
impl PubRec {
pub fn new(message_id: usize) -> Self {
Self {
fixed_header: FixedHeaderBuilder::new().pub_rel().build().unwrap(),
variable_header: GeneralVariableHeader::new(message_id),
}
}
pub fn message_id(&self) -> usize {
self.variable_header.message_id
}
}
impl Encoder for PubRec {
fn encode(&self, buffer: &mut BytesMut) -> Result<usize, ProtoError> {
let fixed_header = FixedHeaderBuilder::new().pub_rec().build();
match fixed_header {
Ok(fixed_header) => {
if let Ok(_resp) = fixed_header.encode(buffer) {
buffer.put_u16(self.variable_header.message_id() as u16);
return Ok(4);
}
Err(ProtoError::EncodeVariableHeaderError)
}
Err(err) => Err(err),
}
}
}
impl Decoder for PubRec {
type Item = PubRec;
type Error = ProtoError;
fn decode(mut bytes: Bytes) -> Result<Self::Item, ProtoError> {
let resp = decoder::read_fixed_header(&mut bytes);
match resp {
Ok(fixed_header) => {
let qos = fixed_header.qos();
let variable_header_index = fixed_header.len();
bytes.advance(variable_header_index);
let resp = GeneralVariableHeader::decode(&mut bytes, qos);
match resp {
Ok(variable_header) => Ok(PubRec {
fixed_header,
variable_header,
}),
Err(e) => return Err(e),
}
}
Err(e) => Err(e),
}
}
}