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
15impl<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
63impl<'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
94impl<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
140impl<'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}