netxserver/
owned_read_half_ex.rs

1use data_rw::DataOwnedReader;
2use std::io;
3use tokio::io::{AsyncRead, AsyncReadExt, AsyncWrite, ReadHalf};
4
5/// A trait that extends the functionality of `ReadHalf`.
6pub(crate) trait ReadHalfExt {
7    /// Reads a string from the `ReadHalf`.
8    ///
9    /// # Errors
10    ///
11    /// Returns an `io::Error` if reading from the `ReadHalf` fails.
12    async fn read_string(&mut self) -> io::Result<String>;
13
14    /// Reads a `DataOwnedReader` from the `ReadHalf`.
15    ///
16    /// # Errors
17    ///
18    /// Returns an `io::Error` if reading from the `ReadHalf` fails.
19    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    /// Reads a string from the `ReadHalf`.
27    ///
28    /// # Errors
29    ///
30    /// Returns an `io::Error` if reading from the `ReadHalf` fails.
31    #[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    /// Reads a `DataOwnedReader` from the `ReadHalf`.
41    ///
42    /// # Errors
43    ///
44    /// Returns an `io::Error` if reading from the `ReadHalf` fails.
45    #[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}