scatter_net/legacy/packet/methods/
to_bytes.rs1use 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}