s2json_core/
map.rs

1use alloc::collections::BTreeMap;
2use core::ops::{Deref, DerefMut};
3use serde::{Deserialize, Deserializer, Serialize, Serializer};
4
5/// A BTreeMap wrapper
6#[derive(Clone, Debug, PartialEq, Default, PartialOrd, Eq)]
7pub struct Map<K: Ord, V> {
8    map: BTreeMap<K, V>,
9}
10impl<K: Ord, V> Map<K, V> {
11    /// Creates an empty `Map<K, V>`
12    pub fn new() -> Map<K, V> {
13        Map { map: BTreeMap::new() }
14    }
15}
16// Automatically expose BTreeMap's methods
17impl<K: Ord, V> Deref for Map<K, V> {
18    type Target = BTreeMap<K, V>;
19
20    fn deref(&self) -> &Self::Target {
21        &self.map
22    }
23}
24impl<K: Ord, V> DerefMut for Map<K, V> {
25    fn deref_mut(&mut self) -> &mut Self::Target {
26        &mut self.map
27    }
28}
29
30impl<K: Ord, V> From<BTreeMap<K, V>> for Map<K, V> {
31    fn from(map: BTreeMap<K, V>) -> Self {
32        Self { map }
33    }
34}
35// Enable `Map<K, V>::from([(_, _), ...])` (same as BTreeMap::from)
36impl<K: Ord, V, const N: usize> From<[(K, V); N]> for Map<K, V> {
37    fn from(arr: [(K, V); N]) -> Self {
38        Self { map: BTreeMap::from(arr) }
39    }
40}
41// Custom serialization
42impl<K: Ord + Serialize, V: Serialize> Serialize for Map<K, V> {
43    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
44    where
45        S: Serializer,
46    {
47        self.map.serialize(serializer) // Serialize only the inner BTreeMap
48    }
49}
50// Custom deserialization
51impl<'de, K: Ord + Deserialize<'de>, V: Deserialize<'de>> Deserialize<'de> for Map<K, V> {
52    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
53    where
54        D: Deserializer<'de>,
55    {
56        let map = BTreeMap::deserialize(deserializer)?;
57        Ok(Self { map }) // Deserialize directly into the inner BTreeMap
58    }
59}