discord_indexmap/
serde.rs

1extern crate serde;
2
3use self::serde::de::value::{MapDeserializer, SeqDeserializer};
4use self::serde::de::{
5    Deserialize, Deserializer, Error, IntoDeserializer, MapAccess, SeqAccess, Visitor,
6};
7use self::serde::ser::{Serialize, SerializeMap, SerializeSeq, Serializer};
8
9use std::fmt::{self, Formatter};
10use std::hash::{BuildHasher, Hash};
11use std::marker::PhantomData;
12
13use IndexMap;
14
15/// Requires crate feature `"serde-1"`
16impl<K, V, S> Serialize for IndexMap<K, V, S>
17where
18    K: Serialize + Hash + Eq,
19    V: Serialize,
20    S: BuildHasher,
21{
22    fn serialize<T>(&self, serializer: T) -> Result<T::Ok, T::Error>
23    where
24        T: Serializer,
25    {
26        let mut map_serializer = serializer.serialize_map(Some(self.len()))?;
27        for (key, value) in self {
28            map_serializer.serialize_entry(key, value)?;
29        }
30        map_serializer.end()
31    }
32}
33
34struct OrderMapVisitor<K, V, S>(PhantomData<(K, V, S)>);
35
36impl<'de, K, V, S> Visitor<'de> for OrderMapVisitor<K, V, S>
37where
38    K: Deserialize<'de> + Eq + Hash,
39    V: Deserialize<'de>,
40    S: Default + BuildHasher,
41{
42    type Value = IndexMap<K, V, S>;
43
44    fn expecting(&self, formatter: &mut Formatter) -> fmt::Result {
45        write!(formatter, "a map")
46    }
47
48    fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
49    where
50        A: MapAccess<'de>,
51    {
52        let mut values =
53            IndexMap::with_capacity_and_hasher(map.size_hint().unwrap_or(0), S::default());
54
55        while let Some((key, value)) = map.next_entry()? {
56            values.insert(key, value);
57        }
58
59        Ok(values)
60    }
61}
62
63/// Requires crate feature `"serde-1"`
64impl<'de, K, V, S> Deserialize<'de> for IndexMap<K, V, S>
65where
66    K: Deserialize<'de> + Eq + Hash,
67    V: Deserialize<'de>,
68    S: Default + BuildHasher,
69{
70    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
71    where
72        D: Deserializer<'de>,
73    {
74        deserializer.deserialize_map(OrderMapVisitor(PhantomData))
75    }
76}
77
78impl<'de, K, V, S, E> IntoDeserializer<'de, E> for IndexMap<K, V, S>
79where
80    K: IntoDeserializer<'de, E> + Eq + Hash,
81    V: IntoDeserializer<'de, E>,
82    S: BuildHasher,
83    E: Error,
84{
85    type Deserializer = MapDeserializer<'de, <Self as IntoIterator>::IntoIter, E>;
86
87    fn into_deserializer(self) -> Self::Deserializer {
88        MapDeserializer::new(self.into_iter())
89    }
90}
91
92use IndexSet;
93
94/// Requires crate feature `"serde-1"`
95impl<T, S> Serialize for IndexSet<T, S>
96where
97    T: Serialize + Hash + Eq,
98    S: BuildHasher,
99{
100    fn serialize<Se>(&self, serializer: Se) -> Result<Se::Ok, Se::Error>
101    where
102        Se: Serializer,
103    {
104        let mut set_serializer = serializer.serialize_seq(Some(self.len()))?;
105        for value in self {
106            set_serializer.serialize_element(value)?;
107        }
108        set_serializer.end()
109    }
110}
111
112struct OrderSetVisitor<T, S>(PhantomData<(T, S)>);
113
114impl<'de, T, S> Visitor<'de> for OrderSetVisitor<T, S>
115where
116    T: Deserialize<'de> + Eq + Hash,
117    S: Default + BuildHasher,
118{
119    type Value = IndexSet<T, S>;
120
121    fn expecting(&self, formatter: &mut Formatter) -> fmt::Result {
122        write!(formatter, "a set")
123    }
124
125    fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
126    where
127        A: SeqAccess<'de>,
128    {
129        let mut values =
130            IndexSet::with_capacity_and_hasher(seq.size_hint().unwrap_or(0), S::default());
131
132        while let Some(value) = seq.next_element()? {
133            values.insert(value);
134        }
135
136        Ok(values)
137    }
138}
139
140/// Requires crate feature `"serde-1"`
141impl<'de, T, S> Deserialize<'de> for IndexSet<T, S>
142where
143    T: Deserialize<'de> + Eq + Hash,
144    S: Default + BuildHasher,
145{
146    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
147    where
148        D: Deserializer<'de>,
149    {
150        deserializer.deserialize_seq(OrderSetVisitor(PhantomData))
151    }
152}
153
154impl<'de, T, S, E> IntoDeserializer<'de, E> for IndexSet<T, S>
155where
156    T: IntoDeserializer<'de, E> + Eq + Hash,
157    S: BuildHasher,
158    E: Error,
159{
160    type Deserializer = SeqDeserializer<<Self as IntoIterator>::IntoIter, E>;
161
162    fn into_deserializer(self) -> Self::Deserializer {
163        SeqDeserializer::new(self.into_iter())
164    }
165}