#[derive(Debug, Clone)]
pub struct Packet {
pub header: super::Header,
pub data: bytes::Bytes,
}
impl Packet {
pub fn with_data(property: super::Property, data: &[u8]) -> Self {
Self {
header: super::Header {
property,
sequence: None,
fragment: None,
},
data: bytes::Bytes::copy_from_slice(data),
}
}
pub fn without_data(header: super::Header) -> Self {
Self {
header,
data: bytes::Bytes::new(),
}
}
pub fn parse(slice: &[u8]) -> std::io::Result<Self> {
if slice == &[100, 117, 109, 109, 121] {
Ok(Self {
header: super::Header::with_prop(super::Property::Dummy),
data: bytes::Bytes::new(),
})
} else {
let header = super::Header::parse(slice)?;
Ok(Self {
header,
data: bytes::Bytes::copy_from_slice(&slice[header.len()..]),
})
}
}
pub fn dump<W: std::io::Write>(&self, writer: &mut W) -> std::io::Result<usize> {
if self.header.property == super::Property::Dummy {
writer.write_all(&[100, 117, 109, 109, 121])?;
Ok(5)
} else {
let header_len = self.header.dump(writer)?;
writer.write_all(&self.data)?;
Ok(header_len + self.data.len())
}
}
}