variable_len_reader/synchronous/
mod.rs

1pub mod reader;
2pub mod writer;
3
4pub trait VariableReadable {
5    type Error;
6
7    fn read_single(&mut self) -> Result<u8, Self::Error>;
8
9    fn read_more(&mut self, buf: &mut [u8]) -> Result<(), Self::Error> {
10        for i in 0..buf.len() {
11            buf[i] = self.read_single()?;
12        }
13        Ok(())
14    }
15
16    /// You may call [bytes::BytesMut::limit] to prevent reading more data than needed.
17    #[cfg(feature = "bytes")]
18    #[cfg_attr(docsrs, doc(cfg(feature = "bytes")))]
19    fn read_more_buf<B: bytes::BufMut>(&mut self, buf: &mut B) -> Result<(), Self::Error> {
20        use bytes::BufMut;
21        while buf.has_remaining_mut() {
22            let chunk = buf.chunk_mut();
23            let chunk = unsafe {&mut *core::ptr::slice_from_raw_parts_mut(chunk.as_mut_ptr(), chunk.len()) };
24            self.read_more(chunk)?;
25        }
26        Ok(())
27    }
28}
29
30pub trait VariableWritable {
31    type Error;
32
33    fn write_single(&mut self, byte: u8) -> Result<(), Self::Error>;
34
35    fn write_more(&mut self, buf: &[u8]) -> Result<(), Self::Error> {
36        for i in 0..buf.len() {
37            self.write_single(buf[i])?;
38        }
39        Ok(())
40    }
41
42    #[cfg(feature = "bytes")]
43    #[cfg_attr(docsrs, doc(cfg(feature = "bytes")))]
44    fn write_more_buf<B: bytes::Buf>(&mut self, buf: &mut B) -> Result<(), Self::Error> {
45        use bytes::Buf;
46        while buf.has_remaining() {
47            let chunk = buf.chunk();
48            self.write_more(chunk)?;
49            buf.advance(chunk.len());
50        }
51        Ok(())
52    }
53}