data_rw/
data_owned_reader.rs

1use crate::{DataReader, ReadNumberFixed, ReadNumberVar};
2use anyhow::{ensure, Result};
3use std::ops::Deref;
4
5#[derive(Debug)]
6pub struct DataOwnedReader {
7    pub(crate) inner: Vec<u8>,
8    pub(crate) offset: usize,
9}
10
11impl DataOwnedReader {
12    #[inline]
13    pub fn new(inner: Vec<u8>) -> DataOwnedReader {
14        DataOwnedReader { inner, offset: 0 }
15    }
16
17    #[inline]
18    pub fn into_inner(self) -> Vec<u8> {
19        self.inner
20    }
21    #[inline]
22    pub fn get_reader(&self) -> DataReader {
23        DataReader::from(&self.inner[self.offset..])
24    }
25
26    #[inline]
27    pub fn get_all_reader(&self) -> DataReader {
28        DataReader::from(&self.inner[..])
29    }
30    #[inline]
31    pub fn get_offset(&self) -> usize {
32        self.offset
33    }
34
35    #[inline]
36    pub fn set_offset(&mut self, offset: usize) -> Result<()> {
37        ensure!(offset <= self.inner.len(), "offset big too");
38        self.offset = offset;
39        Ok(())
40    }
41
42    #[inline]
43    pub fn add_offset(&mut self, offset: usize) -> Result<usize> {
44        ensure!(self.offset + offset <= self.inner.len(), "offset big too");
45        self.offset += offset;
46        Ok(self.offset)
47    }
48    #[inline]
49    pub fn sub_offset(&mut self, offset: usize) -> Result<usize> {
50        ensure!(self.offset - offset > 0, "offset min too");
51        self.offset -= offset;
52        Ok(self.offset)
53    }
54
55    #[inline]
56    pub fn read_fixed<T: ReadNumberFixed>(&mut self) -> Result<T> {
57        let mut dr = self.get_reader();
58        let v = dr.read_fixed()?;
59        self.offset += dr.offset();
60        Ok(v)
61    }
62
63    #[inline]
64    pub fn read_var_integer<T: ReadNumberVar>(&mut self) -> Result<T> {
65        let mut dr = self.get_reader();
66        let v = dr.read_var_integer()?;
67        self.offset += dr.offset();
68        Ok(v)
69    }
70
71    #[inline]
72    pub fn read_fixed_buf(&mut self) -> Result<&[u8]> {
73        let mut dr = DataReader::from(&self.inner[self.offset..]);
74        let x = dr.read_fixed_buf()?;
75        self.offset += dr.offset();
76        Ok(x)
77    }
78
79    #[inline]
80    pub fn read_var_buf(&mut self) -> Result<&[u8]> {
81        let mut dr = DataReader::from(&self.inner[self.offset..]);
82        let x = dr.read_var_buf()?;
83        self.offset += dr.offset();
84        Ok(x)
85    }
86
87    #[inline]
88    pub fn read_fixed_str(&mut self) -> Result<&str> {
89        let mut dr = DataReader::from(&self.inner[self.offset..]);
90        let x = dr.read_fixed_str()?;
91        self.offset += dr.offset();
92        Ok(x)
93    }
94
95    #[inline]
96    pub fn read_var_str(&mut self) -> Result<&str> {
97        let mut dr = DataReader::from(&self.inner[self.offset..]);
98        let x = dr.read_var_str()?;
99        self.offset += dr.offset();
100        Ok(x)
101    }
102
103    #[inline]
104    pub fn read_buff(&mut self, buff: &mut [u8]) -> Result<()> {
105        let mut dr = DataReader::from(&self.inner[self.offset..]);
106        dr.read_buff(buff)?;
107        self.offset += dr.offset();
108        Ok(())
109    }
110}
111
112impl Deref for DataOwnedReader {
113    type Target = [u8];
114
115    #[inline]
116    fn deref(&self) -> &Self::Target {
117        &self.inner
118    }
119}
120
121impl AsRef<[u8]> for DataOwnedReader {
122    #[inline]
123    fn as_ref(&self) -> &[u8] {
124        &self.inner
125    }
126}