variable-len-reader 3.2.1

A library for reading/writing variable length data. Support AsyncRead/AsyncWrite in tokio.
Documentation
use core::ops::{Deref, DerefMut};
use crate::{AsyncVariableReader, AsyncVariableWriter};

#[derive(Debug)]
#[repr(transparent)]
pub struct AsyncReaderHelper<'a, R: AsyncVariableReader + Unpin>(pub &'a mut R);

impl<'a, R: AsyncVariableReader + Unpin> Deref for AsyncReaderHelper<'a, R> {
    type Target = R;

    fn deref(&self) -> &Self::Target {
        &self.0
    }
}

impl<'a, R: AsyncVariableReader + Unpin> DerefMut for AsyncReaderHelper<'a, R> {
    fn deref_mut(&mut self) -> &mut Self::Target {
        &mut self.0
    }
}

impl<'a, R: AsyncVariableReader + Unpin> AsyncReaderHelper<'a, R> {
    pub async fn help_read_u8_vec(&'a mut self) -> Result<alloc::vec::Vec<u8>, R::Error> {
        let length = self.read_usize_varint_ap().await?;
        let mut bytes = alloc::vec![0; length];
        self.read_more(&mut bytes).await?;
        Ok(bytes)
    }

    #[cfg(feature = "async_string")]
    #[cfg_attr(docsrs, doc(cfg(feature = "async_string")))]
    pub async fn help_read_string(&'a mut self) -> Result<alloc::string::String, R::Error> {
        match alloc::string::String::from_utf8(self.help_read_u8_vec().await?) {
            Ok(s) => Ok(s),
            Err(e) => Err(R::read_string_error("ReadString", e)),
        }
    }
}


#[derive(Debug)]
#[repr(transparent)]
pub struct AsyncWriterHelper<'a, W: AsyncVariableWriter + Unpin>(pub &'a mut W);

impl<'a, W: AsyncVariableWriter + Unpin> Deref for AsyncWriterHelper<'a, W> {
    type Target = W;

    fn deref(&self) -> &Self::Target {
        &self.0
    }
}

impl<'a, W: AsyncVariableWriter + Unpin> DerefMut for AsyncWriterHelper<'a, W> {
    fn deref_mut(&mut self) -> &mut Self::Target {
        &mut self.0
    }
}

impl<'a, W: AsyncVariableWriter + Unpin> AsyncWriterHelper<'a, W> {
    pub async fn help_write_u8_vec(&'a mut self, bytes: &[u8]) -> Result<(), W::Error> {
        self.write_usize_varint_ap(bytes.len()).await?;
        self.write_more(bytes).await?;
        Ok(())
    }

    #[cfg(feature = "async_string")]
    #[cfg_attr(docsrs, doc(cfg(feature = "async_string")))]
    pub async fn help_write_string(&'a mut self, string: &str) -> Result<(), W::Error> {
        self.help_write_u8_vec(string.as_bytes()).await?;
        Ok(())
    }
}