worterbuch_codec/
nonblocking.rs1use super::{ClientMessage as CM, ServerMessage as SM};
2use crate::{error::DecodeResult, MessageLength, MESSAGE_LENGTH_BYTES};
3use tokio::io::{AsyncRead, AsyncReadExt};
4
5pub async fn read_client_message(data: impl AsyncRead + Unpin) -> DecodeResult<Option<CM>> {
6 let buf = match read_message_bytes(data).await {
7 Some(it) => it,
8 None => return Ok(None),
9 };
10
11 crate::read_client_message(&buf[..]).map(Some)
12}
13
14pub async fn read_server_message(data: impl AsyncRead + Unpin) -> DecodeResult<Option<SM>> {
15 let buf = match read_message_bytes(data).await {
16 Some(it) => it,
17 None => return Ok(None),
18 };
19
20 crate::read_server_message(&buf[..]).map(Some)
21}
22
23async fn read_message_bytes(mut data: impl AsyncRead + Unpin) -> Option<Vec<u8>> {
24 let mut len_buf = [0; MESSAGE_LENGTH_BYTES];
25 if let Err(e) = data.read_exact(&mut len_buf).await {
26 log::debug!("client disconnected: {e}");
27 return None;
28 }
29 let length = MessageLength::from_be_bytes(len_buf);
30
31 let mut buf = vec![0; length as usize];
32 if let Err(e) = data.read_exact(&mut buf).await {
33 log::debug!("client disconnected: {e}");
34 return None;
35 }
36
37 let mut msg_data = len_buf.to_vec();
38 msg_data.extend(buf);
39
40 Some(msg_data)
41}