scatter_net/legacy/packet/methods/
to_bytes.rs

1use bytes::Bytes;
2use ps_buffer::Buffer;
3use ps_deflate::compress_into;
4
5use crate::Packet;
6
7impl Packet {
8    pub fn to_bytes(&self) -> Result<Bytes, PacketToBytesError> {
9        let serialized = bitcode::serialize(self)?;
10
11        let ser_len = serialized.len();
12
13        let mut buffer = Buffer::alloc_uninit(ser_len + 13)?;
14
15        let com_len = 8 + compress_into(&serialized, &mut buffer[8..])?;
16
17        buffer.truncate(com_len);
18
19        let com_len = u32::try_from(com_len)?;
20        let ser_len = u32::try_from(ser_len)?;
21
22        buffer[0..4].copy_from_slice(&com_len.to_be_bytes());
23        buffer[4..8].copy_from_slice(&ser_len.to_be_bytes());
24
25        let bytes = Bytes::from_owner(buffer.share());
26
27        Ok(bytes)
28    }
29}
30
31#[derive(thiserror::Error, Debug)]
32pub enum PacketToBytesError {
33    #[error("Buffer allocation failed: {0}")]
34    Buffer(#[from] ps_buffer::BufferError),
35    #[error("Compression failed: {0}")]
36    Compression(#[from] ps_deflate::PsDeflateError),
37    #[error("Integer conversion failed: {0}")]
38    IntConversion(#[from] std::num::TryFromIntError),
39    #[error("bitcode serialization failed: {0}")]
40    Serialization(#[from] bitcode::Error),
41}