aldrin_core/deserializer/
bytes.rs1use crate::buf_ext::ValueBufExt;
2use crate::{DeserializeError, ValueKind};
3
4#[derive(Debug)]
5pub enum BytesDeserializer<'a, 'b> {
6 V1(Bytes1Deserializer<'a, 'b>),
7 V2(Bytes2Deserializer<'a, 'b>),
8}
9
10impl<'a, 'b> BytesDeserializer<'a, 'b> {
11 pub(super) fn new(buf: &'a mut &'b [u8]) -> Result<Self, DeserializeError> {
12 match buf.try_get_discriminant_u8()? {
13 ValueKind::Bytes1 => Bytes1Deserializer::new_without_value_kind(buf).map(Self::V1),
14 ValueKind::Bytes2 => Bytes2Deserializer::new_without_value_kind(buf).map(Self::V2),
15 _ => Err(DeserializeError::UnexpectedValue),
16 }
17 }
18
19 pub fn as_slice(&self) -> Result<&[u8], DeserializeError> {
20 match self {
21 Self::V1(deserializer) => deserializer.as_slice(),
22 Self::V2(deserializer) => deserializer.as_slice(),
23 }
24 }
25
26 pub fn advance(&mut self, cnt: usize) -> Result<(), DeserializeError> {
27 match self {
28 Self::V1(deserializer) => deserializer.advance(cnt),
29 Self::V2(deserializer) => deserializer.advance(cnt),
30 }
31 }
32
33 pub fn deserialize_extend<T>(self, bytes: &mut T) -> Result<(), DeserializeError>
34 where
35 T: Extend<u8>,
36 {
37 match self {
38 Self::V1(deserializer) => deserializer.deserialize_extend(bytes),
39 Self::V2(deserializer) => deserializer.deserialize_extend(bytes),
40 }
41 }
42
43 pub fn skip(self) -> Result<(), DeserializeError> {
44 match self {
45 Self::V1(deserializer) => deserializer.skip(),
46 Self::V2(deserializer) => deserializer.skip(),
47 }
48 }
49
50 pub fn finish<T>(self, t: T) -> Result<T, DeserializeError> {
51 match self {
52 Self::V1(deserializer) => deserializer.finish(t),
53 Self::V2(deserializer) => deserializer.finish(t),
54 }
55 }
56
57 pub fn finish_with<T, F>(self, f: F) -> Result<T, DeserializeError>
58 where
59 F: FnOnce() -> Result<T, DeserializeError>,
60 {
61 match self {
62 Self::V1(deserializer) => deserializer.finish_with(f),
63 Self::V2(deserializer) => deserializer.finish_with(f),
64 }
65 }
66
67 pub fn skip_and_finish<T>(self, t: T) -> Result<T, DeserializeError> {
68 match self {
69 Self::V1(deserializer) => deserializer.skip_and_finish(t),
70 Self::V2(deserializer) => deserializer.skip_and_finish(t),
71 }
72 }
73
74 pub fn skip_and_finish_with<T, F>(self, f: F) -> Result<T, DeserializeError>
75 where
76 F: FnOnce() -> Result<T, DeserializeError>,
77 {
78 match self {
79 Self::V1(deserializer) => deserializer.skip_and_finish_with(f),
80 Self::V2(deserializer) => deserializer.skip_and_finish_with(f),
81 }
82 }
83}
84
85#[derive(Debug)]
86pub struct Bytes1Deserializer<'a, 'b> {
87 buf: &'a mut &'b [u8],
88 len: u32,
89}
90
91impl<'a, 'b> Bytes1Deserializer<'a, 'b> {
92 pub(super) fn new(buf: &'a mut &'b [u8]) -> Result<Self, DeserializeError> {
93 buf.ensure_discriminant_u8(ValueKind::Bytes1)?;
94 Self::new_without_value_kind(buf)
95 }
96
97 pub(super) fn new_without_value_kind(buf: &'a mut &'b [u8]) -> Result<Self, DeserializeError> {
98 let len = buf.try_get_varint_u32_le()?;
99
100 if buf.len() >= len as usize {
101 Ok(Self { buf, len })
102 } else {
103 Err(DeserializeError::InvalidSerialization)
104 }
105 }
106
107 pub fn len(&self) -> usize {
108 self.len as usize
109 }
110
111 pub fn is_empty(&self) -> bool {
112 self.len == 0
113 }
114
115 pub fn as_slice(&self) -> Result<&[u8], DeserializeError> {
116 Ok(&(*self.buf)[..self.len as usize])
117 }
118
119 pub fn advance(&mut self, cnt: usize) -> Result<(), DeserializeError> {
120 if cnt <= self.len as usize {
121 self.buf.try_skip(cnt)?;
122 self.len -= cnt as u32;
123 Ok(())
124 } else {
125 Err(DeserializeError::NoMoreElements)
126 }
127 }
128
129 pub fn deserialize_extend<T>(mut self, bytes: &mut T) -> Result<(), DeserializeError>
130 where
131 T: Extend<u8>,
132 {
133 let slice = self.as_slice()?;
134 bytes.extend(slice.iter().copied());
135 self.advance(slice.len())
136 }
137
138 pub fn skip(mut self) -> Result<(), DeserializeError> {
139 self.advance(self.len as usize)
140 }
141
142 pub fn finish<T>(self, t: T) -> Result<T, DeserializeError> {
143 self.finish_with(|| Ok(t))
144 }
145
146 pub fn finish_with<T, F>(self, f: F) -> Result<T, DeserializeError>
147 where
148 F: FnOnce() -> Result<T, DeserializeError>,
149 {
150 if self.is_empty() {
151 f()
152 } else {
153 Err(DeserializeError::MoreElementsRemain)
154 }
155 }
156
157 pub fn skip_and_finish<T>(self, t: T) -> Result<T, DeserializeError> {
158 self.skip_and_finish_with(|| Ok(t))
159 }
160
161 pub fn skip_and_finish_with<T, F>(self, f: F) -> Result<T, DeserializeError>
162 where
163 F: FnOnce() -> Result<T, DeserializeError>,
164 {
165 self.skip()?;
166 f()
167 }
168}
169
170#[derive(Debug)]
171pub struct Bytes2Deserializer<'a, 'b> {
172 buf: &'a mut &'b [u8],
173 len: usize,
174}
175
176impl<'a, 'b> Bytes2Deserializer<'a, 'b> {
177 pub(super) fn new(buf: &'a mut &'b [u8]) -> Result<Self, DeserializeError> {
178 buf.ensure_discriminant_u8(ValueKind::Bytes2)?;
179 Self::new_without_value_kind(buf)
180 }
181
182 pub(super) fn new_without_value_kind(buf: &'a mut &'b [u8]) -> Result<Self, DeserializeError> {
183 let len = buf.try_get_varint_u32_le()? as usize;
184 Ok(Self { buf, len })
185 }
186
187 pub fn as_slice(&self) -> Result<&[u8], DeserializeError> {
188 if self.buf.len() >= self.len {
189 Ok(&(*self.buf)[..self.len])
190 } else {
191 Err(DeserializeError::InvalidSerialization)
192 }
193 }
194
195 pub fn advance(&mut self, cnt: usize) -> Result<(), DeserializeError> {
196 if self.len > 0 {
197 if cnt <= self.len {
198 self.buf.try_skip(cnt)?;
199 self.len -= cnt;
200
201 if self.len == 0 {
202 self.len = self.buf.try_get_varint_u32_le()? as usize;
203 }
204
205 Ok(())
206 } else {
207 Err(DeserializeError::NoMoreElements)
208 }
209 } else if cnt == 0 {
210 Ok(())
211 } else {
212 Err(DeserializeError::NoMoreElements)
213 }
214 }
215
216 pub fn deserialize_extend<T>(mut self, bytes: &mut T) -> Result<(), DeserializeError>
217 where
218 T: Extend<u8>,
219 {
220 loop {
221 let slice = self.as_slice()?;
222
223 if slice.is_empty() {
224 break Ok(());
225 }
226
227 bytes.extend(slice.iter().copied());
228 self.advance(slice.len())?;
229 }
230 }
231
232 pub fn skip(mut self) -> Result<(), DeserializeError> {
233 while self.len > 0 {
234 self.advance(self.len)?;
235 }
236
237 Ok(())
238 }
239
240 pub fn finish<T>(self, t: T) -> Result<T, DeserializeError> {
241 self.finish_with(|| Ok(t))
242 }
243
244 pub fn finish_with<T, F>(self, f: F) -> Result<T, DeserializeError>
245 where
246 F: FnOnce() -> Result<T, DeserializeError>,
247 {
248 if self.len == 0 {
249 f()
250 } else {
251 Err(DeserializeError::MoreElementsRemain)
252 }
253 }
254
255 pub fn skip_and_finish<T>(self, t: T) -> Result<T, DeserializeError> {
256 self.skip_and_finish_with(|| Ok(t))
257 }
258
259 pub fn skip_and_finish_with<T, F>(self, f: F) -> Result<T, DeserializeError>
260 where
261 F: FnOnce() -> Result<T, DeserializeError>,
262 {
263 self.skip()?;
264 f()
265 }
266}