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}