polywrap_msgpack_serde 0.0.2-beta.6

An msgpack Serializer and Deserializer data format with Serde for Polywrap
Documentation
use serde::de::{DeserializeSeed, MapAccess};

use crate::{Deserializer, error::{Result, Error}};

pub struct MapReadAccess<'a> {
  deserializer: &'a mut Deserializer,
  entries_in_map: u32,
}

impl<'a> MapReadAccess<'a> {
  pub fn new(
      deserializer: &'a mut Deserializer,
      entries_in_map: u32,
  ) -> Self {
      Self {
          deserializer,
          entries_in_map,
      }
  }
}

impl<'a, 'de> MapAccess<'de> for MapReadAccess<'a> {
  type Error = Error;

  fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>
  where
      K: DeserializeSeed<'de>,
  {
      if self.entries_in_map == 0 {
          return Ok(None);
      }

      seed.deserialize(&mut *self.deserializer).map(Some)
  }

  fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value>
  where
      V: DeserializeSeed<'de>,
  {
      self.entries_in_map -= 1;
      seed.deserialize(&mut *self.deserializer)
  }
}