protobuf_lite/
buffer.rs

1use anyhow::Result;
2use std::io::{Error, ErrorKind};
3
4pub struct Reader<T> {
5    buf: T,
6    pos: usize,
7    remain: usize,
8}
9
10impl<T> Reader<T>
11where
12    T: AsRef<[u8]>,
13{
14    pub fn new(data: T) -> Self {
15        let length = data.as_ref().len();
16        Reader {
17            buf: data,
18            pos: 0,
19            remain: length,
20        }
21    }
22
23    #[inline]
24    pub fn reset(&mut self) {
25        self.pos = 0;
26        self.remain = self.buf.as_ref().len();
27    }
28
29    #[inline]
30    pub fn remaining(&self) -> usize {
31        self.remain
32    }
33
34    #[inline]
35    pub fn skip(&mut self, n: usize) -> Result<()> {
36        if self.remain < n {
37            return Err(Error::new(ErrorKind::UnexpectedEof, "unexpected EOF").into());
38        }
39        self.pos += n;
40        self.remain -= n;
41        Ok(())
42    }
43
44    #[inline]
45    pub fn is_end(&self) -> bool {
46        self.remain == 0
47    }
48
49    #[inline]
50    pub fn read_byte(&mut self) -> Result<u8> {
51        if self.remain < 1 {
52            return Err(Error::new(ErrorKind::UnexpectedEof, "unexpected EOF").into());
53        }
54        let b = self.buf.as_ref()[self.pos];
55        self.pos += 1;
56        self.remain -= 1;
57        Ok(b)
58    }
59
60    #[inline]
61    pub fn read_bytes(&mut self, n: usize) -> Result<&[u8]> {
62        if self.remain < n {
63            return Err(Error::new(ErrorKind::UnexpectedEof, "unexpected EOF").into());
64        }
65        let b = &self.buf.as_ref()[self.pos..self.pos + n];
66        self.pos += n;
67        self.remain -= n;
68        Ok(b)
69    }
70
71    #[inline]
72    pub fn read_all_bytes(&mut self) -> Result<&[u8]> {
73        self.read_bytes(self.remain)
74    }
75
76    #[inline]
77    pub fn read_bytes_into(&mut self, dst: &mut [u8]) -> Result<()> {
78        dst.copy_from_slice(self.read_bytes(dst.len())?);
79        Ok(())
80    }
81}