use std::{fmt, marker::PhantomData, ops::Deref};
use serde::{
de::{MapAccess, Visitor},
Deserialize,
};
use crate::InOMap;
pub struct MyVisitor<K, V>
where
K: Clone + Eq,
V: Clone,
{
marker: PhantomData<fn() -> InOMap<K, V>>,
}
impl<K, V> MyVisitor<K, V>
where
K: Clone + Eq,
V: Clone,
{
pub fn new() -> Self {
MyVisitor {
marker: PhantomData,
}
}
}
impl<'de, K, V> Visitor<'de> for MyVisitor<K, V>
where
K: Deserialize<'de> + Clone + Eq + Deref,
V: Deserialize<'de> + Clone,
<K as Deref>::Target: Eq,
{
type Value = InOMap<K, V>;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_str("a very special map")
}
fn visit_map<M>(self, mut access: M) -> Result<Self::Value, M::Error>
where
M: MapAccess<'de>,
{
let mut map = InOMap::new();
while let Some((key, value)) = access.next_entry()? {
map.insert(key, value);
}
Ok(map)
}
}