worterbuch_codec/
nonblocking.rs

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