hmap_serde/hmap/
ser.rs

1use frunk_core::hlist::{HCons, HList, HNil};
2use serde::ser::SerializeMap;
3use serde::{Serialize, Serializer};
4
5use crate::HMap;
6
7impl<T> Serialize for HMap<T>
8where
9    T: HList,
10    Self: MapSerializable,
11{
12    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
13    where
14        S: Serializer,
15    {
16        let mut map = serializer.serialize_map(Some(T::LEN))?;
17        self.serialize_map(&mut map)?;
18        map.end()
19    }
20}
21
22pub trait MapSerializable {
23    fn serialize_map<S: SerializeMap>(&self, serializer: &mut S) -> Result<(), S::Error>;
24}
25
26impl<K, V, T> MapSerializable for HMap<HCons<(K, V), T>>
27where
28    K: Serialize,
29    V: Serialize,
30    HMap<T>: MapSerializable,
31{
32    fn serialize_map<S: SerializeMap>(&self, serializer: &mut S) -> Result<(), S::Error> {
33        let (k, v) = &self.0.head;
34        serializer.serialize_entry(k, v)?;
35        HMap::ref_cast(&self.0.tail).serialize_map(serializer)
36    }
37}
38
39impl<K, V, T> MapSerializable for HMap<HCons<Option<(K, V)>, T>>
40where
41    K: Serialize,
42    V: Serialize,
43    HMap<T>: MapSerializable,
44{
45    fn serialize_map<S: SerializeMap>(&self, serializer: &mut S) -> Result<(), S::Error> {
46        if let Some((k, v)) = &self.0.head {
47            serializer.serialize_entry(k, v)?;
48        }
49        HMap::ref_cast(&self.0.tail).serialize_map(serializer)
50    }
51}
52
53impl MapSerializable for HMap<HNil> {
54    fn serialize_map<S: SerializeMap>(&self, _serializer: &mut S) -> Result<(), S::Error> {
55        Ok(())
56    }
57}