netxserver/
owned_read_half_ex.rs1use data_rw::DataOwnedReader;
2use std::io;
3use tokio::io::{AsyncRead, AsyncReadExt, AsyncWrite, ReadHalf};
4
5pub(crate) trait ReadHalfExt {
7 async fn read_string(&mut self) -> io::Result<String>;
13
14 async fn read_buff(&mut self) -> io::Result<DataOwnedReader>;
20}
21
22impl<C> ReadHalfExt for &mut ReadHalf<C>
23where
24 C: AsyncRead + AsyncWrite + Send + 'static,
25{
26 #[inline]
32 async fn read_string(&mut self) -> io::Result<String> {
33 let len = self.read_u32_le().await? as usize;
34 let mut data = vec![0; len];
35 let r = self.read_exact(&mut data).await?;
36 debug_assert_eq!(len, r);
37 Ok(String::from_utf8_lossy(&data).to_string())
38 }
39
40 #[inline]
46 async fn read_buff(&mut self) -> io::Result<DataOwnedReader> {
47 let len = (self.read_u32_le().await? - 4) as usize;
48 let mut data = vec![0; len];
49 let r = self.read_exact(&mut data).await?;
50 debug_assert_eq!(len, r);
51 Ok(DataOwnedReader::new(data))
52 }
53}