1use crate::buf_ext::ValueBufExt;
2use crate::deserialize_key::{DeserializeKey, Sealed as _};
3use crate::error::DeserializeError;
4use crate::ids::{
5 ChannelCookie, ObjectCookie, ObjectId, ObjectUuid, ServiceCookie, ServiceId, ServiceUuid,
6};
7use crate::serialized_value::{SerializedValue, SerializedValueSlice};
8use crate::unknown_fields::UnknownFields;
9use crate::unknown_variant::UnknownVariant;
10use crate::value::ValueKind;
11use crate::MAX_VALUE_DEPTH;
12use bytes::Buf;
13use std::iter;
14use std::marker::PhantomData;
15use uuid::Uuid;
16
17pub trait Deserialize: Sized {
18 fn deserialize(deserializer: Deserializer) -> Result<Self, DeserializeError>;
19}
20
21#[derive(Debug)]
22pub struct Deserializer<'a, 'b> {
23 buf: &'a mut &'b [u8],
24 depth: u8,
25}
26
27impl<'a, 'b> Deserializer<'a, 'b> {
28 pub(crate) fn new(buf: &'a mut &'b [u8], depth: u8) -> Result<Self, DeserializeError> {
29 let mut this = Self { buf, depth };
30 this.increment_depth()?;
31 Ok(this)
32 }
33
34 fn increment_depth(&mut self) -> Result<(), DeserializeError> {
35 self.depth += 1;
36 if self.depth <= MAX_VALUE_DEPTH {
37 Ok(())
38 } else {
39 Err(DeserializeError::TooDeeplyNested)
40 }
41 }
42
43 #[allow(clippy::len_without_is_empty)]
44 pub fn len(&self) -> Result<usize, DeserializeError> {
45 let mut buf = *self.buf;
46 Deserializer::new(&mut buf, self.depth - 1)?.skip()?;
47
48 Ok(buf.as_ptr() as usize - (*self.buf).as_ptr() as usize)
51 }
52
53 pub fn split_off_serialized_value(self) -> Result<&'b SerializedValueSlice, DeserializeError> {
54 let len = self.len()?;
55 let res = SerializedValueSlice::new(&self.buf[..len]);
56 self.buf.advance(len);
57 Ok(res)
58 }
59
60 pub fn peek_value_kind(&self) -> Result<ValueKind, DeserializeError> {
61 self.buf.try_peek_discriminant_u8()
62 }
63
64 pub fn skip(self) -> Result<(), DeserializeError> {
65 match self.buf.try_get_discriminant_u8()? {
66 ValueKind::None => Ok(()),
67 ValueKind::Some => self.skip(),
68 ValueKind::Bool | ValueKind::U8 | ValueKind::I8 => self.buf.try_skip(1),
69 ValueKind::U16 => self.buf.try_skip_varint_le::<2>(),
70 ValueKind::I16 => self.buf.try_skip_varint_le::<2>(),
71 ValueKind::U32 => self.buf.try_skip_varint_le::<4>(),
72 ValueKind::I32 => self.buf.try_skip_varint_le::<4>(),
73 ValueKind::U64 => self.buf.try_skip_varint_le::<8>(),
74 ValueKind::I64 => self.buf.try_skip_varint_le::<8>(),
75 ValueKind::F32 => self.buf.try_skip(4),
76 ValueKind::F64 => self.buf.try_skip(8),
77 ValueKind::String => {
78 let len = self.buf.try_get_varint_u32_le()? as usize;
79 self.buf.try_skip(len)
80 }
81 ValueKind::Uuid | ValueKind::Sender | ValueKind::Receiver => self.buf.try_skip(16),
82 ValueKind::ObjectId => self.buf.try_skip(32),
83 ValueKind::ServiceId => self.buf.try_skip(64),
84 ValueKind::Vec => VecDeserializer::new_without_value_kind(self.buf, self.depth)?.skip(),
85 ValueKind::Bytes => BytesDeserializer::new_without_value_kind(self.buf)?.skip_all(),
86 ValueKind::U8Map => {
87 MapDeserializer::<u8>::new_without_value_kind(self.buf, self.depth)?.skip()
88 }
89 ValueKind::I8Map => {
90 MapDeserializer::<i8>::new_without_value_kind(self.buf, self.depth)?.skip()
91 }
92 ValueKind::U16Map => {
93 MapDeserializer::<u16>::new_without_value_kind(self.buf, self.depth)?.skip()
94 }
95 ValueKind::I16Map => {
96 MapDeserializer::<i16>::new_without_value_kind(self.buf, self.depth)?.skip()
97 }
98 ValueKind::U32Map => {
99 MapDeserializer::<u32>::new_without_value_kind(self.buf, self.depth)?.skip()
100 }
101 ValueKind::I32Map => {
102 MapDeserializer::<i32>::new_without_value_kind(self.buf, self.depth)?.skip()
103 }
104 ValueKind::U64Map => {
105 MapDeserializer::<u64>::new_without_value_kind(self.buf, self.depth)?.skip()
106 }
107 ValueKind::I64Map => {
108 MapDeserializer::<i64>::new_without_value_kind(self.buf, self.depth)?.skip()
109 }
110 ValueKind::StringMap => {
111 MapDeserializer::<String>::new_without_value_kind(self.buf, self.depth)?.skip()
112 }
113 ValueKind::UuidMap => {
114 MapDeserializer::<Uuid>::new_without_value_kind(self.buf, self.depth)?.skip()
115 }
116 ValueKind::U8Set => SetDeserializer::<u8>::new_without_value_kind(self.buf)?.skip(),
117 ValueKind::I8Set => SetDeserializer::<i8>::new_without_value_kind(self.buf)?.skip(),
118 ValueKind::U16Set => SetDeserializer::<u16>::new_without_value_kind(self.buf)?.skip(),
119 ValueKind::I16Set => SetDeserializer::<i16>::new_without_value_kind(self.buf)?.skip(),
120 ValueKind::U32Set => SetDeserializer::<u32>::new_without_value_kind(self.buf)?.skip(),
121 ValueKind::I32Set => SetDeserializer::<i32>::new_without_value_kind(self.buf)?.skip(),
122 ValueKind::U64Set => SetDeserializer::<u64>::new_without_value_kind(self.buf)?.skip(),
123 ValueKind::I64Set => SetDeserializer::<i64>::new_without_value_kind(self.buf)?.skip(),
124 ValueKind::StringSet => {
125 SetDeserializer::<String>::new_without_value_kind(self.buf)?.skip()
126 }
127 ValueKind::UuidSet => SetDeserializer::<Uuid>::new_without_value_kind(self.buf)?.skip(),
128 ValueKind::Struct => {
129 StructDeserializer::new_without_value_kind(self.buf, self.depth)?.skip()
130 }
131 ValueKind::Enum => {
132 EnumDeserializer::new_without_value_kind(self.buf, self.depth)?.skip()
133 }
134 }
135 }
136
137 pub fn deserialize<T: Deserialize>(self) -> Result<T, DeserializeError> {
138 T::deserialize(self)
139 }
140
141 pub fn deserialize_none(self) -> Result<(), DeserializeError> {
142 self.buf.ensure_discriminant_u8(ValueKind::None)
143 }
144
145 pub fn deserialize_some<T: Deserialize>(mut self) -> Result<T, DeserializeError> {
146 self.increment_depth()?;
147 self.buf.ensure_discriminant_u8(ValueKind::Some)?;
148 T::deserialize(self)
149 }
150
151 pub fn deserialize_option<T: Deserialize>(mut self) -> Result<Option<T>, DeserializeError> {
152 self.increment_depth()?;
153 match self.buf.try_get_discriminant_u8()? {
154 ValueKind::Some => T::deserialize(self).map(Some),
155 ValueKind::None => Ok(None),
156 _ => Err(DeserializeError::UnexpectedValue),
157 }
158 }
159
160 pub fn deserialize_bool(self) -> Result<bool, DeserializeError> {
161 self.buf.ensure_discriminant_u8(ValueKind::Bool)?;
162 self.buf.try_get_u8().map(|v| v != 0)
163 }
164
165 pub fn deserialize_u8(self) -> Result<u8, DeserializeError> {
166 self.buf.ensure_discriminant_u8(ValueKind::U8)?;
167 self.buf.try_get_u8()
168 }
169
170 pub fn deserialize_i8(self) -> Result<i8, DeserializeError> {
171 self.buf.ensure_discriminant_u8(ValueKind::I8)?;
172 self.buf.try_get_i8()
173 }
174
175 pub fn deserialize_u16(self) -> Result<u16, DeserializeError> {
176 self.buf.ensure_discriminant_u8(ValueKind::U16)?;
177 self.buf.try_get_varint_u16_le()
178 }
179
180 pub fn deserialize_i16(self) -> Result<i16, DeserializeError> {
181 self.buf.ensure_discriminant_u8(ValueKind::I16)?;
182 self.buf.try_get_varint_i16_le()
183 }
184
185 pub fn deserialize_u32(self) -> Result<u32, DeserializeError> {
186 self.buf.ensure_discriminant_u8(ValueKind::U32)?;
187 self.buf.try_get_varint_u32_le()
188 }
189
190 pub fn deserialize_i32(self) -> Result<i32, DeserializeError> {
191 self.buf.ensure_discriminant_u8(ValueKind::I32)?;
192 self.buf.try_get_varint_i32_le()
193 }
194
195 pub fn deserialize_u64(self) -> Result<u64, DeserializeError> {
196 self.buf.ensure_discriminant_u8(ValueKind::U64)?;
197 self.buf.try_get_varint_u64_le()
198 }
199
200 pub fn deserialize_i64(self) -> Result<i64, DeserializeError> {
201 self.buf.ensure_discriminant_u8(ValueKind::I64)?;
202 self.buf.try_get_varint_i64_le()
203 }
204
205 pub fn deserialize_f32(self) -> Result<f32, DeserializeError> {
206 self.buf.ensure_discriminant_u8(ValueKind::F32)?;
207 self.buf.try_get_u32_le().map(f32::from_bits)
208 }
209
210 pub fn deserialize_f64(self) -> Result<f64, DeserializeError> {
211 self.buf.ensure_discriminant_u8(ValueKind::F64)?;
212 self.buf.try_get_u64_le().map(f64::from_bits)
213 }
214
215 pub fn deserialize_string(self) -> Result<String, DeserializeError> {
216 self.buf.ensure_discriminant_u8(ValueKind::String)?;
217 let len = self.buf.try_get_varint_u32_le()? as usize;
218 let bytes = self.buf.try_copy_to_bytes(len)?.into();
219 String::from_utf8(bytes).map_err(|_| DeserializeError::InvalidSerialization)
220 }
221
222 pub fn deserialize_uuid(self) -> Result<Uuid, DeserializeError> {
223 self.buf.ensure_discriminant_u8(ValueKind::Uuid)?;
224 let mut bytes = uuid::Bytes::default();
225 self.buf.try_copy_to_slice(&mut bytes)?;
226 Ok(Uuid::from_bytes(bytes))
227 }
228
229 pub fn deserialize_object_id(self) -> Result<ObjectId, DeserializeError> {
230 self.buf.ensure_discriminant_u8(ValueKind::ObjectId)?;
231 let mut bytes = uuid::Bytes::default();
232
233 self.buf.try_copy_to_slice(&mut bytes)?;
234 let uuid = ObjectUuid(Uuid::from_bytes(bytes));
235
236 self.buf.try_copy_to_slice(&mut bytes)?;
237 let cookie = ObjectCookie(Uuid::from_bytes(bytes));
238
239 Ok(ObjectId::new(uuid, cookie))
240 }
241
242 pub fn deserialize_service_id(self) -> Result<ServiceId, DeserializeError> {
243 self.buf.ensure_discriminant_u8(ValueKind::ServiceId)?;
244 let mut bytes = uuid::Bytes::default();
245
246 self.buf.try_copy_to_slice(&mut bytes)?;
247 let object_uuid = ObjectUuid(Uuid::from_bytes(bytes));
248
249 self.buf.try_copy_to_slice(&mut bytes)?;
250 let object_cookie = ObjectCookie(Uuid::from_bytes(bytes));
251
252 self.buf.try_copy_to_slice(&mut bytes)?;
253 let service_uuid = ServiceUuid(Uuid::from_bytes(bytes));
254
255 self.buf.try_copy_to_slice(&mut bytes)?;
256 let service_cookie = ServiceCookie(Uuid::from_bytes(bytes));
257
258 Ok(ServiceId::new(
259 ObjectId::new(object_uuid, object_cookie),
260 service_uuid,
261 service_cookie,
262 ))
263 }
264
265 pub fn deserialize_vec(self) -> Result<VecDeserializer<'a, 'b>, DeserializeError> {
266 VecDeserializer::new(self.buf, self.depth)
267 }
268
269 pub fn deserialize_vec_extend<V, T>(self, vec: &mut V) -> Result<(), DeserializeError>
270 where
271 V: Extend<T>,
272 T: Deserialize,
273 {
274 self.deserialize_vec()?.deserialize_extend(vec)
275 }
276
277 pub fn deserialize_vec_extend_new<V, T>(self) -> Result<V, DeserializeError>
278 where
279 V: Extend<T> + Default,
280 T: Deserialize,
281 {
282 let mut vec = V::default();
283 self.deserialize_vec()?.deserialize_extend(&mut vec)?;
284 Ok(vec)
285 }
286
287 pub fn deserialize_bytes(self) -> Result<BytesDeserializer<'a, 'b>, DeserializeError> {
288 BytesDeserializer::new(self.buf)
289 }
290
291 pub fn deserialize_bytes_to_vec(self) -> Result<Vec<u8>, DeserializeError> {
292 BytesDeserializer::new(self.buf)?.deserialize_all_to_vec()
293 }
294
295 pub fn deserialize_map<K: DeserializeKey>(
296 self,
297 ) -> Result<MapDeserializer<'a, 'b, K>, DeserializeError> {
298 MapDeserializer::new(self.buf, self.depth)
299 }
300
301 pub fn deserialize_map_extend<T, K, V>(self, map: &mut T) -> Result<(), DeserializeError>
302 where
303 T: Extend<(K, V)>,
304 K: DeserializeKey,
305 V: Deserialize,
306 {
307 MapDeserializer::new(self.buf, self.depth)?.deserialize_extend(map)
308 }
309
310 pub fn deserialize_map_extend_new<T, K, V>(self) -> Result<T, DeserializeError>
311 where
312 T: Extend<(K, V)> + Default,
313 K: DeserializeKey,
314 V: Deserialize,
315 {
316 let mut map = T::default();
317 MapDeserializer::new(self.buf, self.depth)?.deserialize_extend(&mut map)?;
318 Ok(map)
319 }
320
321 pub fn deserialize_set<T: DeserializeKey>(
322 self,
323 ) -> Result<SetDeserializer<'a, 'b, T>, DeserializeError> {
324 SetDeserializer::new(self.buf)
325 }
326
327 pub fn deserialize_set_extend<T, S>(self, set: &mut S) -> Result<(), DeserializeError>
328 where
329 S: Extend<T>,
330 T: DeserializeKey,
331 {
332 SetDeserializer::new(self.buf)?.deserialize_extend(set)
333 }
334
335 pub fn deserialize_set_extend_new<T, S>(self) -> Result<S, DeserializeError>
336 where
337 S: Extend<T> + Default,
338 T: DeserializeKey,
339 {
340 let mut set = S::default();
341 SetDeserializer::new(self.buf)?.deserialize_extend(&mut set)?;
342 Ok(set)
343 }
344
345 pub fn deserialize_struct(self) -> Result<StructDeserializer<'a, 'b>, DeserializeError> {
346 StructDeserializer::new(self.buf, self.depth)
347 }
348
349 pub fn deserialize_enum(self) -> Result<EnumDeserializer<'a, 'b>, DeserializeError> {
350 EnumDeserializer::new(self.buf, self.depth)
351 }
352
353 pub fn deserialize_sender(self) -> Result<ChannelCookie, DeserializeError> {
354 self.buf.ensure_discriminant_u8(ValueKind::Sender)?;
355 let mut bytes = uuid::Bytes::default();
356 self.buf.try_copy_to_slice(&mut bytes)?;
357 Ok(ChannelCookie(Uuid::from_bytes(bytes)))
358 }
359
360 pub fn deserialize_receiver(self) -> Result<ChannelCookie, DeserializeError> {
361 self.buf.ensure_discriminant_u8(ValueKind::Receiver)?;
362 let mut bytes = uuid::Bytes::default();
363 self.buf.try_copy_to_slice(&mut bytes)?;
364 Ok(ChannelCookie(Uuid::from_bytes(bytes)))
365 }
366}
367
368#[derive(Debug)]
369pub struct VecDeserializer<'a, 'b> {
370 buf: &'a mut &'b [u8],
371 len: u32,
372 depth: u8,
373}
374
375impl<'a, 'b> VecDeserializer<'a, 'b> {
376 fn new(buf: &'a mut &'b [u8], depth: u8) -> Result<Self, DeserializeError> {
377 buf.ensure_discriminant_u8(ValueKind::Vec)?;
378 Self::new_without_value_kind(buf, depth)
379 }
380
381 fn new_without_value_kind(buf: &'a mut &'b [u8], depth: u8) -> Result<Self, DeserializeError> {
382 let len = buf.try_get_varint_u32_le()?;
383
384 Ok(Self { buf, len, depth })
385 }
386
387 pub fn len(&self) -> usize {
388 self.len as usize
389 }
390
391 pub fn is_empty(&self) -> bool {
392 self.len == 0
393 }
394
395 pub fn deserialize_element<T>(&mut self) -> Result<T, DeserializeError>
396 where
397 T: Deserialize,
398 {
399 if self.is_empty() {
400 Err(DeserializeError::NoMoreElements)
401 } else {
402 self.len -= 1;
403 T::deserialize(Deserializer::new(self.buf, self.depth)?)
404 }
405 }
406
407 pub fn deserialize_extend<V, T>(mut self, vec: &mut V) -> Result<(), DeserializeError>
408 where
409 V: Extend<T>,
410 T: Deserialize,
411 {
412 while !self.is_empty() {
413 let elem = self.deserialize_element()?;
414 vec.extend(iter::once(elem));
415 }
416
417 Ok(())
418 }
419
420 pub fn skip_element(&mut self) -> Result<(), DeserializeError> {
421 if self.is_empty() {
422 Err(DeserializeError::NoMoreElements)
423 } else {
424 self.len -= 1;
425 Deserializer::new(self.buf, self.depth)?.skip()
426 }
427 }
428
429 pub fn skip(mut self) -> Result<(), DeserializeError> {
430 while !self.is_empty() {
431 self.skip_element()?;
432 }
433
434 Ok(())
435 }
436
437 pub fn finish<T>(self, t: T) -> Result<T, DeserializeError> {
438 if self.is_empty() {
439 Ok(t)
440 } else {
441 Err(DeserializeError::MoreElementsRemain)
442 }
443 }
444
445 pub fn finish_with<T, F>(self, f: F) -> Result<T, DeserializeError>
446 where
447 F: FnOnce() -> Result<T, DeserializeError>,
448 {
449 if self.is_empty() {
450 f()
451 } else {
452 Err(DeserializeError::MoreElementsRemain)
453 }
454 }
455
456 pub fn skip_and_finish<T>(self, t: T) -> Result<T, DeserializeError> {
457 self.skip()?;
458 Ok(t)
459 }
460
461 pub fn skip_and_finish_with<T, F>(self, f: F) -> Result<T, DeserializeError>
462 where
463 F: FnOnce() -> Result<T, DeserializeError>,
464 {
465 self.skip()?;
466 f()
467 }
468}
469
470#[derive(Debug)]
471pub struct BytesDeserializer<'a, 'b> {
472 buf: &'a mut &'b [u8],
473 len: u32,
474}
475
476impl<'a, 'b> BytesDeserializer<'a, 'b> {
477 fn new(buf: &'a mut &'b [u8]) -> Result<Self, DeserializeError> {
478 buf.ensure_discriminant_u8(ValueKind::Bytes)?;
479 Self::new_without_value_kind(buf)
480 }
481
482 fn new_without_value_kind(buf: &'a mut &'b [u8]) -> Result<Self, DeserializeError> {
483 let len = buf.try_get_varint_u32_le()?;
484 Ok(Self { buf, len })
485 }
486
487 pub fn len(&self) -> usize {
488 self.len as usize
489 }
490
491 pub fn is_empty(&self) -> bool {
492 self.len == 0
493 }
494
495 pub fn deserialize(&mut self, dst: &mut [u8]) -> Result<(), DeserializeError> {
496 if dst.len() <= self.len as usize {
497 self.buf.try_copy_to_slice(dst)?;
498 self.len -= dst.len() as u32;
499 Ok(())
500 } else {
501 Err(DeserializeError::NoMoreElements)
502 }
503 }
504
505 pub fn deserialize_to_vec(&mut self, len: usize) -> Result<Vec<u8>, DeserializeError> {
506 if self.len as usize >= len {
507 let bytes = self.buf.try_copy_to_bytes(self.len as usize)?;
508 self.len -= len as u32;
509 Ok(Vec::from(bytes))
510 } else {
511 Err(DeserializeError::NoMoreElements)
512 }
513 }
514
515 pub fn deserialize_all_to_vec(mut self) -> Result<Vec<u8>, DeserializeError> {
516 self.deserialize_to_vec(self.len as usize)
517 }
518
519 pub fn skip(&mut self, len: usize) -> Result<(), DeserializeError> {
520 if self.len as usize >= len {
521 self.buf.try_skip(len)?;
522 self.len -= len as u32;
523 Ok(())
524 } else {
525 Err(DeserializeError::NoMoreElements)
526 }
527 }
528
529 pub fn skip_all(mut self) -> Result<(), DeserializeError> {
530 self.skip(self.len as usize)
531 }
532
533 pub fn finish<T>(self, t: T) -> Result<T, DeserializeError> {
534 if self.is_empty() {
535 Ok(t)
536 } else {
537 Err(DeserializeError::MoreElementsRemain)
538 }
539 }
540
541 pub fn finish_with<T, F>(self, f: F) -> Result<T, DeserializeError>
542 where
543 F: FnOnce() -> Result<T, DeserializeError>,
544 {
545 if self.is_empty() {
546 f()
547 } else {
548 Err(DeserializeError::MoreElementsRemain)
549 }
550 }
551
552 pub fn skip_and_finish<T>(self, t: T) -> Result<T, DeserializeError> {
553 self.skip_all()?;
554 Ok(t)
555 }
556
557 pub fn skip_and_finish_with<T, F>(self, f: F) -> Result<T, DeserializeError>
558 where
559 F: FnOnce() -> Result<T, DeserializeError>,
560 {
561 self.skip_all()?;
562 f()
563 }
564}
565
566#[derive(Debug)]
567pub struct MapDeserializer<'a, 'b, K: DeserializeKey> {
568 buf: &'a mut &'b [u8],
569 len: u32,
570 depth: u8,
571 _key: PhantomData<K>,
572}
573
574impl<'a, 'b, K: DeserializeKey> MapDeserializer<'a, 'b, K> {
575 fn new(buf: &'a mut &'b [u8], depth: u8) -> Result<Self, DeserializeError> {
576 K::Impl::deserialize_map_value_kind(buf)?;
577 Self::new_without_value_kind(buf, depth)
578 }
579
580 fn new_without_value_kind(buf: &'a mut &'b [u8], depth: u8) -> Result<Self, DeserializeError> {
581 let len = buf.try_get_varint_u32_le()?;
582
583 Ok(Self {
584 buf,
585 len,
586 depth,
587 _key: PhantomData,
588 })
589 }
590
591 pub fn len(&self) -> usize {
592 self.len as usize
593 }
594
595 pub fn is_empty(&self) -> bool {
596 self.len == 0
597 }
598
599 pub fn deserialize_element(
600 &mut self,
601 ) -> Result<ElementDeserializer<'_, 'b, K>, DeserializeError> {
602 if self.is_empty() {
603 Err(DeserializeError::NoMoreElements)
604 } else {
605 self.len -= 1;
606 ElementDeserializer::new(self.buf, self.depth)
607 }
608 }
609
610 pub fn deserialize_extend<T, V>(mut self, map: &mut T) -> Result<(), DeserializeError>
611 where
612 T: Extend<(K, V)>,
613 V: Deserialize,
614 {
615 while !self.is_empty() {
616 let kv = self.deserialize_element()?.deserialize()?;
617 map.extend(iter::once(kv));
618 }
619
620 Ok(())
621 }
622
623 pub fn skip_element(&mut self) -> Result<(), DeserializeError> {
624 if self.is_empty() {
625 Err(DeserializeError::NoMoreElements)
626 } else {
627 self.len -= 1;
628 K::Impl::skip(self.buf)?;
629 Deserializer::new(self.buf, self.depth)?.skip()
630 }
631 }
632
633 pub fn skip(mut self) -> Result<(), DeserializeError> {
634 while !self.is_empty() {
635 self.skip_element()?;
636 }
637
638 Ok(())
639 }
640
641 pub fn finish<T>(self, t: T) -> Result<T, DeserializeError> {
642 if self.is_empty() {
643 Ok(t)
644 } else {
645 Err(DeserializeError::MoreElementsRemain)
646 }
647 }
648
649 pub fn finish_with<T, F>(self, f: F) -> Result<T, DeserializeError>
650 where
651 F: FnOnce() -> Result<T, DeserializeError>,
652 {
653 if self.is_empty() {
654 f()
655 } else {
656 Err(DeserializeError::MoreElementsRemain)
657 }
658 }
659
660 pub fn skip_and_finish<T>(self, t: T) -> Result<T, DeserializeError> {
661 self.skip()?;
662 Ok(t)
663 }
664
665 pub fn skip_and_finish_with<T, F>(self, f: F) -> Result<T, DeserializeError>
666 where
667 F: FnOnce() -> Result<T, DeserializeError>,
668 {
669 self.skip()?;
670 f()
671 }
672}
673
674#[derive(Debug)]
675pub struct ElementDeserializer<'a, 'b, K: DeserializeKey> {
676 buf: &'a mut &'b [u8],
677 key: K,
678 depth: u8,
679}
680
681impl<'a, 'b, K: DeserializeKey> ElementDeserializer<'a, 'b, K> {
682 fn new(buf: &'a mut &'b [u8], depth: u8) -> Result<Self, DeserializeError> {
683 let key = K::Impl::deserialize_key(buf)?;
684 let key = K::try_from_impl(key)?;
685 Ok(Self { buf, key, depth })
686 }
687
688 pub fn key(&self) -> &K {
689 &self.key
690 }
691
692 pub fn deserialize<T: Deserialize>(self) -> Result<(K, T), DeserializeError> {
693 let value = T::deserialize(Deserializer::new(self.buf, self.depth)?)?;
694 Ok((self.key, value))
695 }
696
697 pub fn skip(self) -> Result<(), DeserializeError> {
698 Deserializer::new(self.buf, self.depth)?.skip()
699 }
700}
701
702#[derive(Debug)]
703pub struct SetDeserializer<'a, 'b, T: DeserializeKey> {
704 buf: &'a mut &'b [u8],
705 len: u32,
706 _key: PhantomData<T>,
707}
708
709impl<'a, 'b, T: DeserializeKey> SetDeserializer<'a, 'b, T> {
710 fn new(buf: &'a mut &'b [u8]) -> Result<Self, DeserializeError> {
711 T::Impl::deserialize_set_value_kind(buf)?;
712 Self::new_without_value_kind(buf)
713 }
714
715 fn new_without_value_kind(buf: &'a mut &'b [u8]) -> Result<Self, DeserializeError> {
716 let len = buf.try_get_varint_u32_le()?;
717
718 Ok(Self {
719 buf,
720 len,
721 _key: PhantomData,
722 })
723 }
724
725 pub fn len(&self) -> usize {
726 self.len as usize
727 }
728
729 pub fn is_empty(&self) -> bool {
730 self.len == 0
731 }
732
733 pub fn deserialize_element(&mut self) -> Result<T, DeserializeError> {
734 if self.is_empty() {
735 Err(DeserializeError::NoMoreElements)
736 } else {
737 self.len -= 1;
738 let key = T::Impl::deserialize_key(self.buf)?;
739 T::try_from_impl(key)
740 }
741 }
742
743 pub fn deserialize_extend<S>(mut self, set: &mut S) -> Result<(), DeserializeError>
744 where
745 S: Extend<T>,
746 {
747 while !self.is_empty() {
748 let kv = self.deserialize_element()?;
749 set.extend(iter::once(kv));
750 }
751
752 Ok(())
753 }
754
755 pub fn skip_element(&mut self) -> Result<(), DeserializeError> {
756 if self.is_empty() {
757 Err(DeserializeError::NoMoreElements)
758 } else {
759 self.len -= 1;
760 T::Impl::skip(self.buf)
761 }
762 }
763
764 pub fn skip(mut self) -> Result<(), DeserializeError> {
765 while !self.is_empty() {
766 self.skip_element()?;
767 }
768
769 Ok(())
770 }
771
772 pub fn finish<T2>(self, t: T2) -> Result<T2, DeserializeError> {
773 if self.is_empty() {
774 Ok(t)
775 } else {
776 Err(DeserializeError::MoreElementsRemain)
777 }
778 }
779
780 pub fn finish_with<T2, F>(self, f: F) -> Result<T2, DeserializeError>
781 where
782 F: FnOnce() -> Result<T2, DeserializeError>,
783 {
784 if self.is_empty() {
785 f()
786 } else {
787 Err(DeserializeError::MoreElementsRemain)
788 }
789 }
790
791 pub fn skip_and_finish<T2>(self, t: T2) -> Result<T2, DeserializeError> {
792 self.skip()?;
793 Ok(t)
794 }
795
796 pub fn skip_and_finish_with<T2, F>(self, f: F) -> Result<T2, DeserializeError>
797 where
798 F: FnOnce() -> Result<T2, DeserializeError>,
799 {
800 self.skip()?;
801 f()
802 }
803}
804
805#[derive(Debug)]
806pub struct StructDeserializer<'a, 'b> {
807 buf: &'a mut &'b [u8],
808 num_fields: u32,
809 depth: u8,
810 unknown_fields: UnknownFields,
811}
812
813impl<'a, 'b> StructDeserializer<'a, 'b> {
814 fn new(buf: &'a mut &'b [u8], depth: u8) -> Result<Self, DeserializeError> {
815 buf.ensure_discriminant_u8(ValueKind::Struct)?;
816 Self::new_without_value_kind(buf, depth)
817 }
818
819 fn new_without_value_kind(buf: &'a mut &'b [u8], depth: u8) -> Result<Self, DeserializeError> {
820 let num_fields = buf.try_get_varint_u32_le()?;
821
822 Ok(Self {
823 buf,
824 num_fields,
825 depth,
826 unknown_fields: UnknownFields::new(),
827 })
828 }
829
830 pub fn remaining_fields(&self) -> usize {
831 self.num_fields as usize
832 }
833
834 pub fn has_more_fields(&self) -> bool {
835 self.num_fields > 0
836 }
837
838 pub fn deserialize_field(&mut self) -> Result<FieldDeserializer<'_, 'b>, DeserializeError> {
839 if self.has_more_fields() {
840 self.num_fields -= 1;
841 FieldDeserializer::new(self.buf, self.depth, &mut self.unknown_fields)
842 } else {
843 Err(DeserializeError::NoMoreElements)
844 }
845 }
846
847 pub fn deserialize_specific_field<T: Deserialize>(
848 &mut self,
849 id: impl Into<u32>,
850 ) -> Result<T, DeserializeError> {
851 let field = self.deserialize_field()?;
852
853 if field.id() == id.into() {
854 field.deserialize()
855 } else {
856 Err(DeserializeError::InvalidSerialization)
857 }
858 }
859
860 pub fn skip(mut self) -> Result<(), DeserializeError> {
861 while self.has_more_fields() {
862 self.deserialize_field()?.skip()?;
863 }
864
865 Ok(())
866 }
867
868 pub fn finish<T>(self, t: T) -> Result<T, DeserializeError> {
869 if self.has_more_fields() {
870 Err(DeserializeError::MoreElementsRemain)
871 } else {
872 Ok(t)
873 }
874 }
875
876 pub fn finish_with<T, F>(self, f: F) -> Result<T, DeserializeError>
877 where
878 F: FnOnce(UnknownFields) -> Result<T, DeserializeError>,
879 {
880 if self.has_more_fields() {
881 Err(DeserializeError::MoreElementsRemain)
882 } else {
883 f(self.unknown_fields)
884 }
885 }
886
887 pub fn skip_and_finish<T>(self, t: T) -> Result<T, DeserializeError> {
888 self.skip()?;
889 Ok(t)
890 }
891
892 pub fn skip_and_finish_with<T, F>(mut self, f: F) -> Result<T, DeserializeError>
893 where
894 F: FnOnce(UnknownFields) -> Result<T, DeserializeError>,
895 {
896 while self.has_more_fields() {
897 self.deserialize_field()?.skip()?;
898 }
899
900 f(self.unknown_fields)
901 }
902}
903
904#[derive(Debug)]
905pub struct FieldDeserializer<'a, 'b> {
906 buf: &'a mut &'b [u8],
907 id: u32,
908 depth: u8,
909 unknown_fields: &'a mut UnknownFields,
910}
911
912impl<'a, 'b> FieldDeserializer<'a, 'b> {
913 fn new(
914 buf: &'a mut &'b [u8],
915 depth: u8,
916 unknown_fields: &'a mut UnknownFields,
917 ) -> Result<Self, DeserializeError> {
918 let id = buf.try_get_varint_u32_le()?;
919
920 Ok(Self {
921 buf,
922 id,
923 depth,
924 unknown_fields,
925 })
926 }
927
928 pub fn id(&self) -> u32 {
929 self.id
930 }
931
932 pub fn try_id<T: TryFrom<u32>>(&self) -> Result<T, DeserializeError> {
933 self.id
934 .try_into()
935 .map_err(|_| DeserializeError::InvalidSerialization)
936 }
937
938 pub fn deserialize<T: Deserialize>(self) -> Result<T, DeserializeError> {
939 T::deserialize(Deserializer::new(self.buf, self.depth)?)
940 }
941
942 pub fn skip(self) -> Result<(), DeserializeError> {
943 Deserializer::new(self.buf, self.depth)?.skip()
944 }
945
946 pub fn add_to_unknown_fields(self) -> Result<(), DeserializeError> {
947 let value = SerializedValue::deserialize(Deserializer::new(self.buf, self.depth)?)?;
948 self.unknown_fields.insert(self.id, value);
949 Ok(())
950 }
951}
952
953#[derive(Debug)]
954pub struct EnumDeserializer<'a, 'b> {
955 buf: &'a mut &'b [u8],
956 variant: u32,
957 depth: u8,
958}
959
960impl<'a, 'b> EnumDeserializer<'a, 'b> {
961 fn new(buf: &'a mut &'b [u8], depth: u8) -> Result<Self, DeserializeError> {
962 buf.ensure_discriminant_u8(ValueKind::Enum)?;
963 Self::new_without_value_kind(buf, depth)
964 }
965
966 fn new_without_value_kind(buf: &'a mut &'b [u8], depth: u8) -> Result<Self, DeserializeError> {
967 let variant = buf.try_get_varint_u32_le()?;
968 Ok(Self {
969 buf,
970 variant,
971 depth,
972 })
973 }
974
975 pub fn variant(&self) -> u32 {
976 self.variant
977 }
978
979 pub fn try_variant<T: TryFrom<u32>>(&self) -> Result<T, DeserializeError> {
980 self.variant
981 .try_into()
982 .map_err(|_| DeserializeError::InvalidSerialization)
983 }
984
985 pub fn deserialize<T: Deserialize>(self) -> Result<T, DeserializeError> {
986 T::deserialize(Deserializer::new(self.buf, self.depth)?)
987 }
988
989 pub fn into_unknown_variant(self) -> Result<UnknownVariant, DeserializeError> {
990 let id = self.variant;
991 let value = self.deserialize()?;
992 Ok(UnknownVariant::new(id, value))
993 }
994
995 pub fn skip(self) -> Result<(), DeserializeError> {
996 Deserializer::new(self.buf, self.depth)?.skip()
997 }
998}