use std::collections::BTreeMap;
use serde::{Deserialize, Serialize, de::DeserializeOwned};
pub(crate) fn serialize<S, K, V>(map: &BTreeMap<K, V>, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
K: Serialize,
V: Serialize,
{
Serialize::serialize(&map.iter().collect::<Vec<_>>(), serializer)
}
pub(crate) fn deserialize<'de, D, K, V>(deserializer: D) -> Result<BTreeMap<K, V>, D::Error>
where
D: serde::Deserializer<'de>,
K: Ord + DeserializeOwned,
V: DeserializeOwned,
{
<Vec<(K, V)> as Deserialize>::deserialize(deserializer)
.map(|entries| entries.into_iter().collect())
}
pub(crate) mod nested {
use std::collections::BTreeMap;
use serde::{Deserialize, Serialize, de::DeserializeOwned};
type NestedMap<K, IK, IV> = BTreeMap<K, BTreeMap<IK, IV>>;
pub(crate) fn serialize<S, K, IK, IV>(
map: &NestedMap<K, IK, IV>,
serializer: S,
) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
K: Serialize,
IK: Serialize,
IV: Serialize,
{
let entries = map
.iter()
.map(|(key, values)| (key, values.iter().collect::<Vec<_>>()))
.collect::<Vec<_>>();
Serialize::serialize(&entries, serializer)
}
pub(crate) fn deserialize<'de, D, K, IK, IV>(
deserializer: D,
) -> Result<NestedMap<K, IK, IV>, D::Error>
where
D: serde::Deserializer<'de>,
K: Ord + DeserializeOwned,
IK: Ord + DeserializeOwned,
IV: DeserializeOwned,
{
<Vec<(K, Vec<(IK, IV)>)> as Deserialize>::deserialize(deserializer).map(|entries| {
entries
.into_iter()
.map(|(key, values)| (key, values.into_iter().collect()))
.collect()
})
}
}