aldrin_core/deserializer/
set.rs

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