MCPcopy Create free account
hub / github.com/SoftbearStudios/bitcode / deserialize_map

Method deserialize_map

src/serde/de.rs:392–465  ·  view source on GitHub ↗
(mut self, v: V)

Source from the content-addressed store, hash-verified

390 }
391
392 fn deserialize_map<V>(mut self, v: V) -> Result<V::Value>
393 where
394 V: Visitor<'de>,
395 {
396 let (length_decoder, decoders) = specify!(self, Map);
397 let len = length_decoder.decode();
398
399 struct Access<'a, 'de> {
400 decoders: &'a mut (SerdeDecoder<'de>, SerdeDecoder<'de>),
401 input: &'a mut &'de [u8],
402 len: usize,
403 key_deserialized: bool,
404 }
405
406 impl<'de> MapAccess<'de> for Access<'_, 'de> {
407 type Error = Error;
408
409 #[inline(always)]
410 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>
411 where
412 K: DeserializeSeed<'de>,
413 {
414 guard_zst::<K::Value>(self.len)?;
415 if self.len != 0 {
416 self.len -= 1;
417 // Safety: Make sure next_value_seed is called at most once after each len decrement.
418 // We don't care if DeserializeSeed fails after this (not critical to safety).
419 self.key_deserialized = true;
420 Ok(Some(DeserializeSeed::deserialize(
421 seed,
422 DecoderWrapper {
423 decoder: &mut self.decoders.0,
424 input: &mut *self.input,
425 },
426 )?))
427 } else {
428 Ok(None)
429 }
430 }
431
432 #[inline(always)]
433 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value>
434 where
435 V: DeserializeSeed<'de>,
436 {
437 // Safety: Make sure next_value_seed is called at most once after each len decrement
438 // since only len values exist.
439 assert!(
440 std::mem::take(&mut self.key_deserialized),
441 "next_value_seed before next_key_seed"
442 );
443 DeserializeSeed::deserialize(
444 seed,
445 DecoderWrapper {
446 decoder: &mut self.decoders.1,
447 input: &mut *self.input,
448 },
449 )

Callers 1

map_incorrect_len_valuesFunction · 0.80

Calls 2

visit_mapMethod · 0.80
decodeMethod · 0.45

Tested by

no test coverage detected