data_rw/
data_owned_reader.rs1use 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}