interstice_core/network/
packet.rs1use crate::{error::IntersticeError, network::protocol::NetworkPacket};
2use interstice_abi::{decode, encode};
3use tokio::io::{AsyncReadExt, AsyncWriteExt};
4
5pub async fn write_packet<W: AsyncWriteExt + Unpin>(
6 writer: &mut W,
7 packet: &NetworkPacket,
8) -> Result<(), IntersticeError> {
9 let bytes = encode(packet).map_err(|err| {
10 IntersticeError::Internal(format!("Couldn't encode network packet: {}", err))
11 })?;
12 writer
13 .write_u32(bytes.len() as u32)
14 .await
15 .map_err(|err| IntersticeError::Internal(format!("Failed to write packet: {err}")))?;
16 writer
17 .write_all(&bytes)
18 .await
19 .map_err(|err| IntersticeError::Internal(format!("Failed to write packet: {err}")))?;
20 Ok(())
21}
22
23pub async fn read_packet<R: AsyncReadExt + Unpin>(
24 reader: &mut R,
25) -> Result<NetworkPacket, IntersticeError> {
26 let len = reader
27 .read_u32()
28 .await
29 .map_err(|err| IntersticeError::Internal(format!("Failed to read packet: {err}")))?;
30 let mut buf = vec![0u8; len as usize];
31 reader
32 .read_exact(&mut buf)
33 .await
34 .map_err(|err| IntersticeError::Internal(format!("Failed to read packet: {err}")))?;
35 Ok(decode(&buf).map_err(|_err| IntersticeError::Internal("Failed to decode packet".into()))?)
36}