stable-map 0.15.0

A hash map with temporarily stable indices
Documentation
#[cfg(test)]
mod tests;

use {
    crate::StableMap,
    core::{
        fmt::Formatter,
        hash::{BuildHasher, Hash},
    },
    serde::{
        de::{MapAccess, Visitor},
        ser::SerializeMap,
        Deserialize, Deserializer, Serialize, Serializer,
    },
};

impl<K, V, H> Serialize for StableMap<K, V, H>
where
    K: Serialize,
    V: Serialize,
{
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: Serializer,
    {
        let mut map = serializer.serialize_map(Some(self.len()))?;
        for (key, value) in self {
            map.serialize_entry(&key, &value)?;
        }
        map.end()
    }
}

impl<'de, K, V, S> Deserialize<'de> for StableMap<K, V, S>
where
    K: Eq + Hash + Deserialize<'de>,
    V: Deserialize<'de>,
    S: BuildHasher + Default,
{
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: Deserializer<'de>,
    {
        deserializer.deserialize_map(Vis(StableMap::default()))
    }
}

struct Vis<K, V, S>(StableMap<K, V, S>);

impl<'de, K, V, S> Visitor<'de> for Vis<K, V, S>
where
    K: Eq + Hash + Deserialize<'de>,
    V: Deserialize<'de>,
    S: BuildHasher,
{
    type Value = StableMap<K, V, S>;

    fn expecting(&self, formatter: &mut Formatter) -> core::fmt::Result {
        write!(formatter, "a map")
    }

    fn visit_map<A>(mut self, mut map: A) -> Result<Self::Value, A::Error>
    where
        A: MapAccess<'de>,
    {
        while let Some((key, value)) = map.next_entry()? {
            self.0.insert(key, value);
        }
        Ok(self.0)
    }
}