aldrin_core/deserializer/
struct_.rs

1use super::Deserializer;
2use crate::buf_ext::ValueBufExt;
3use crate::tags::Tag;
4use crate::{Deserialize, DeserializeError, UnknownFields, ValueKind};
5
6#[derive(Debug)]
7pub enum StructDeserializer<'a, 'b> {
8    V1(Struct1Deserializer<'a, 'b>),
9    V2(Struct2Deserializer<'a, 'b>),
10}
11
12impl<'a, 'b> StructDeserializer<'a, 'b> {
13    pub(super) fn new(buf: &'a mut &'b [u8], depth: u8) -> Result<Self, DeserializeError> {
14        match buf.try_get_discriminant_u8()? {
15            ValueKind::Struct1 => {
16                Struct1Deserializer::new_without_value_kind(buf, depth).map(Self::V1)
17            }
18
19            ValueKind::Struct2 => {
20                Struct2Deserializer::new_without_value_kind(buf, depth).map(Self::V2)
21            }
22
23            _ => Err(DeserializeError::UnexpectedValue),
24        }
25    }
26
27    pub fn deserialize(&mut self) -> Result<Option<FieldDeserializer<'_, 'b>>, DeserializeError> {
28        match self {
29            Self::V1(deserializer) => deserializer.deserialize(),
30            Self::V2(deserializer) => deserializer.deserialize(),
31        }
32    }
33
34    pub fn deserialize_specific_field<T: Tag, U: Deserialize<T>>(
35        &mut self,
36        id: impl Into<u32>,
37    ) -> Result<U, DeserializeError> {
38        match self {
39            Self::V1(deserializer) => deserializer.deserialize_specific_field(id),
40            Self::V2(deserializer) => deserializer.deserialize_specific_field(id),
41        }
42    }
43
44    pub fn skip(self) -> Result<(), DeserializeError> {
45        match self {
46            Self::V1(deserializer) => deserializer.skip(),
47            Self::V2(deserializer) => deserializer.skip(),
48        }
49    }
50
51    pub fn finish<T>(self, t: T) -> Result<T, DeserializeError> {
52        match self {
53            Self::V1(deserializer) => deserializer.finish(t),
54            Self::V2(deserializer) => deserializer.finish(t),
55        }
56    }
57
58    pub fn finish_with<T, F>(self, f: F) -> Result<T, DeserializeError>
59    where
60        F: FnOnce(UnknownFields) -> Result<T, DeserializeError>,
61    {
62        match self {
63            Self::V1(deserializer) => deserializer.finish_with(f),
64            Self::V2(deserializer) => deserializer.finish_with(f),
65        }
66    }
67
68    pub fn skip_and_finish<T>(self, t: T) -> Result<T, DeserializeError> {
69        match self {
70            Self::V1(deserializer) => deserializer.skip_and_finish(t),
71            Self::V2(deserializer) => deserializer.skip_and_finish(t),
72        }
73    }
74
75    pub fn skip_and_finish_with<T, F>(self, f: F) -> Result<T, DeserializeError>
76    where
77        F: FnOnce(UnknownFields) -> Result<T, DeserializeError>,
78    {
79        match self {
80            Self::V1(deserializer) => deserializer.skip_and_finish_with(f),
81            Self::V2(deserializer) => deserializer.skip_and_finish_with(f),
82        }
83    }
84}
85
86#[derive(Debug)]
87pub struct Struct1Deserializer<'a, 'b> {
88    buf: &'a mut &'b [u8],
89    len: u32,
90    depth: u8,
91    unknown_fields: UnknownFields,
92}
93
94impl<'a, 'b> Struct1Deserializer<'a, 'b> {
95    pub(super) fn new(buf: &'a mut &'b [u8], depth: u8) -> Result<Self, DeserializeError> {
96        buf.ensure_discriminant_u8(ValueKind::Struct1)?;
97        Self::new_without_value_kind(buf, depth)
98    }
99
100    pub(super) fn new_without_value_kind(
101        buf: &'a mut &'b [u8],
102        depth: u8,
103    ) -> Result<Self, DeserializeError> {
104        let len = buf.try_get_varint_u32_le()?;
105
106        Ok(Self {
107            buf,
108            len,
109            depth,
110            unknown_fields: UnknownFields::new(),
111        })
112    }
113
114    pub fn len(&self) -> usize {
115        self.len as usize
116    }
117
118    pub fn is_empty(&self) -> bool {
119        self.len == 0
120    }
121
122    pub fn deserialize(&mut self) -> Result<Option<FieldDeserializer<'_, 'b>>, DeserializeError> {
123        if self.is_empty() {
124            Ok(None)
125        } else {
126            self.len -= 1;
127            FieldDeserializer::new(self.buf, self.depth, &mut self.unknown_fields).map(Some)
128        }
129    }
130
131    pub fn deserialize_specific_field<T: Tag, U: Deserialize<T>>(
132        &mut self,
133        id: impl Into<u32>,
134    ) -> Result<U, DeserializeError> {
135        let field = self
136            .deserialize()?
137            .ok_or(DeserializeError::InvalidSerialization)?;
138
139        if field.id() == id.into() {
140            field.deserialize()
141        } else {
142            Err(DeserializeError::InvalidSerialization)
143        }
144    }
145
146    pub fn skip(mut self) -> Result<(), DeserializeError> {
147        while let Some(field) = self.deserialize()? {
148            field.skip()?;
149        }
150
151        Ok(())
152    }
153
154    pub fn finish<T>(self, t: T) -> Result<T, DeserializeError> {
155        self.finish_with(|_| Ok(t))
156    }
157
158    pub fn finish_with<T, F>(self, f: F) -> Result<T, DeserializeError>
159    where
160        F: FnOnce(UnknownFields) -> Result<T, DeserializeError>,
161    {
162        if self.is_empty() {
163            f(self.unknown_fields)
164        } else {
165            Err(DeserializeError::MoreElementsRemain)
166        }
167    }
168
169    pub fn skip_and_finish<T>(self, t: T) -> Result<T, DeserializeError> {
170        self.skip_and_finish_with(|_| Ok(t))
171    }
172
173    pub fn skip_and_finish_with<T, F>(mut self, f: F) -> Result<T, DeserializeError>
174    where
175        F: FnOnce(UnknownFields) -> Result<T, DeserializeError>,
176    {
177        while let Some(field) = self.deserialize()? {
178            field.skip()?;
179        }
180
181        f(self.unknown_fields)
182    }
183}
184
185#[derive(Debug)]
186pub struct Struct2Deserializer<'a, 'b> {
187    buf: &'a mut &'b [u8],
188    empty: bool,
189    depth: u8,
190    unknown_fields: UnknownFields,
191}
192
193impl<'a, 'b> Struct2Deserializer<'a, 'b> {
194    pub(super) fn new(buf: &'a mut &'b [u8], depth: u8) -> Result<Self, DeserializeError> {
195        buf.ensure_discriminant_u8(ValueKind::Struct2)?;
196        Self::new_without_value_kind(buf, depth)
197    }
198
199    pub(super) fn new_without_value_kind(
200        buf: &'a mut &'b [u8],
201        depth: u8,
202    ) -> Result<Self, DeserializeError> {
203        Ok(Self {
204            buf,
205            empty: false,
206            depth,
207            unknown_fields: UnknownFields::new(),
208        })
209    }
210
211    pub fn deserialize(&mut self) -> Result<Option<FieldDeserializer<'_, 'b>>, DeserializeError> {
212        if self.empty {
213            Ok(None)
214        } else {
215            match self.buf.try_get_discriminant_u8()? {
216                ValueKind::None => {
217                    self.empty = true;
218                    Ok(None)
219                }
220
221                ValueKind::Some => {
222                    FieldDeserializer::new(self.buf, self.depth, &mut self.unknown_fields).map(Some)
223                }
224
225                _ => Err(DeserializeError::InvalidSerialization),
226            }
227        }
228    }
229
230    pub fn deserialize_specific_field<T: Tag, U: Deserialize<T>>(
231        &mut self,
232        id: impl Into<u32>,
233    ) -> Result<U, DeserializeError> {
234        let field = self
235            .deserialize()?
236            .ok_or(DeserializeError::InvalidSerialization)?;
237
238        if field.id() == id.into() {
239            field.deserialize()
240        } else {
241            Err(DeserializeError::InvalidSerialization)
242        }
243    }
244
245    pub fn skip(mut self) -> Result<(), DeserializeError> {
246        while let Some(field) = self.deserialize()? {
247            field.skip()?;
248        }
249
250        Ok(())
251    }
252
253    pub fn finish<T>(self, t: T) -> Result<T, DeserializeError> {
254        self.finish_with(|_| Ok(t))
255    }
256
257    pub fn finish_with<T, F>(self, f: F) -> Result<T, DeserializeError>
258    where
259        F: FnOnce(UnknownFields) -> Result<T, DeserializeError>,
260    {
261        if self.empty {
262            f(self.unknown_fields)
263        } else {
264            match self.buf.try_get_discriminant_u8()? {
265                ValueKind::None => f(self.unknown_fields),
266                ValueKind::Some => Err(DeserializeError::MoreElementsRemain),
267                _ => Err(DeserializeError::InvalidSerialization),
268            }
269        }
270    }
271
272    pub fn skip_and_finish<T>(self, t: T) -> Result<T, DeserializeError> {
273        self.skip_and_finish_with(|_| Ok(t))
274    }
275
276    pub fn skip_and_finish_with<T, F>(mut self, f: F) -> Result<T, DeserializeError>
277    where
278        F: FnOnce(UnknownFields) -> Result<T, DeserializeError>,
279    {
280        while let Some(field) = self.deserialize()? {
281            field.skip()?;
282        }
283
284        f(self.unknown_fields)
285    }
286}
287
288#[derive(Debug)]
289pub struct FieldDeserializer<'a, 'b> {
290    buf: &'a mut &'b [u8],
291    id: u32,
292    depth: u8,
293    unknown_fields: &'a mut UnknownFields,
294}
295
296impl<'a, 'b> FieldDeserializer<'a, 'b> {
297    fn new(
298        buf: &'a mut &'b [u8],
299        depth: u8,
300        unknown_fields: &'a mut UnknownFields,
301    ) -> Result<Self, DeserializeError> {
302        let id = buf.try_get_varint_u32_le()?;
303
304        Ok(Self {
305            buf,
306            id,
307            depth,
308            unknown_fields,
309        })
310    }
311
312    pub fn id(&self) -> u32 {
313        self.id
314    }
315
316    pub fn try_id<T: TryFrom<u32>>(&self) -> Result<T, DeserializeError> {
317        self.id
318            .try_into()
319            .map_err(|_| DeserializeError::InvalidSerialization)
320    }
321
322    pub fn deserialize<T: Tag, U: Deserialize<T>>(self) -> Result<U, DeserializeError> {
323        Deserializer::new(self.buf, self.depth)?.deserialize()
324    }
325
326    pub fn skip(self) -> Result<(), DeserializeError> {
327        Deserializer::new(self.buf, self.depth)?.skip()
328    }
329
330    pub fn add_to_unknown_fields(self) -> Result<(), DeserializeError> {
331        let deserializer = Deserializer::new(self.buf, self.depth)?;
332        let value = deserializer.deserialize()?;
333        self.unknown_fields.insert(self.id, value);
334        Ok(())
335    }
336}