Skip to main content

interstice_core/network/
packet.rs

1use 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}