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}