1use serde::{
6 de::{
7 Deserialize,
8 Deserializer,
9 MapAccess,
10 SeqAccess,
11 Visitor,
12 },
13 ser::{
14 Serialize,
15 SerializeMap,
16 SerializeSeq,
17 Serializer,
18 },
19};
20use core::{
21 marker::PhantomData,
22 ops::Deref,
23};
24
25use core::fmt;
26
27use crate::{
28 ordmap::OrdMap,
29 ordset::OrdSet,
30 vector::Vector,
31};
32
33struct SeqVisitor<'de, S, A>
34where
35 S: From<Vec<A>>,
36 A: Deserialize<'de>, {
37 phantom_s: PhantomData<S>,
38 phantom_a: PhantomData<A>,
39 phantom_lifetime: PhantomData<&'de ()>,
40}
41
42impl<'de, S, A> SeqVisitor<'de, S, A>
43where
44 S: From<Vec<A>>,
45 A: Deserialize<'de>,
46{
47 pub(crate) fn new() -> SeqVisitor<'de, S, A> {
48 SeqVisitor {
49 phantom_s: PhantomData,
50 phantom_a: PhantomData,
51 phantom_lifetime: PhantomData,
52 }
53 }
54}
55
56impl<'de, S, A> Visitor<'de> for SeqVisitor<'de, S, A>
57where
58 S: From<Vec<A>>,
59 A: Deserialize<'de>,
60{
61 type Value = S;
62
63 fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
64 formatter.write_str("a sequence")
65 }
66
67 fn visit_seq<Access>(
68 self,
69 mut access: Access,
70 ) -> Result<Self::Value, Access::Error>
71 where
72 Access: SeqAccess<'de>,
73 {
74 let mut v: Vec<A> = match access.size_hint() {
75 None => Vec::new(),
76 Some(l) => Vec::with_capacity(l),
77 };
78 while let Some(i) = access.next_element()? {
79 v.push(i)
80 }
81 Ok(From::from(v))
82 }
83}
84
85struct MapVisitor<'de, S, K, V>
86where
87 S: From<Vec<(K, V)>>,
88 K: Deserialize<'de>,
89 V: Deserialize<'de>, {
90 phantom_s: PhantomData<S>,
91 phantom_k: PhantomData<K>,
92 phantom_v: PhantomData<V>,
93 phantom_lifetime: PhantomData<&'de ()>,
94}
95
96impl<'de, S, K, V> MapVisitor<'de, S, K, V>
97where
98 S: From<Vec<(K, V)>>,
99 K: Deserialize<'de>,
100 V: Deserialize<'de>,
101{
102 pub(crate) fn new() -> MapVisitor<'de, S, K, V> {
103 MapVisitor {
104 phantom_s: PhantomData,
105 phantom_k: PhantomData,
106 phantom_v: PhantomData,
107 phantom_lifetime: PhantomData,
108 }
109 }
110}
111
112impl<'de, S, K, V> Visitor<'de> for MapVisitor<'de, S, K, V>
113where
114 S: From<Vec<(K, V)>>,
115 K: Deserialize<'de>,
116 V: Deserialize<'de>,
117{
118 type Value = S;
119
120 fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
121 formatter.write_str("a sequence")
122 }
123
124 fn visit_map<Access>(
125 self,
126 mut access: Access,
127 ) -> Result<Self::Value, Access::Error>
128 where
129 Access: MapAccess<'de>,
130 {
131 let mut v: Vec<(K, V)> = match access.size_hint() {
132 None => Vec::new(),
133 Some(l) => Vec::with_capacity(l),
134 };
135 while let Some(i) = access.next_entry()? {
136 v.push(i)
137 }
138 Ok(From::from(v))
139 }
140}
141
142impl<'de, A: Deserialize<'de> + Ord + Clone> Deserialize<'de> for OrdSet<A> {
145 fn deserialize<D>(des: D) -> Result<Self, D::Error>
146 where D: Deserializer<'de> {
147 des.deserialize_seq(SeqVisitor::new())
148 }
149}
150
151impl<A: Ord + Clone + Serialize> Serialize for OrdSet<A> {
152 fn serialize<S>(&self, ser: S) -> Result<S::Ok, S::Error>
153 where S: Serializer {
154 let mut s = ser.serialize_seq(Some(self.len()))?;
155 for i in self.iter() {
156 s.serialize_element(i.deref())?;
157 }
158 s.end()
159 }
160}
161
162impl<'de, K: Deserialize<'de> + Ord + Clone, V: Deserialize<'de> + Clone>
165 Deserialize<'de> for OrdMap<K, V>
166{
167 fn deserialize<D>(des: D) -> Result<Self, D::Error>
168 where D: Deserializer<'de> {
169 des.deserialize_map(MapVisitor::<'de, OrdMap<K, V>, K, V>::new())
170 }
171}
172
173impl<K: Serialize + Ord + Clone, V: Serialize + Clone> Serialize
174 for OrdMap<K, V>
175{
176 fn serialize<S>(&self, ser: S) -> Result<S::Ok, S::Error>
177 where S: Serializer {
178 let mut s = ser.serialize_map(Some(self.len()))?;
179 for (k, v) in self.iter() {
180 s.serialize_entry(k.deref(), v.deref())?;
181 }
182 s.end()
183 }
184}
185
186impl<'de, A: Clone + Deserialize<'de>> Deserialize<'de> for Vector<A> {
243 fn deserialize<D>(des: D) -> Result<Self, D::Error>
244 where D: Deserializer<'de> {
245 des.deserialize_seq(SeqVisitor::<'de, Vector<A>, A>::new())
246 }
247}
248
249impl<A: Clone + Serialize> Serialize for Vector<A> {
250 fn serialize<S>(&self, ser: S) -> Result<S::Ok, S::Error>
251 where S: Serializer {
252 let mut s = ser.serialize_seq(Some(self.len()))?;
253 for i in self.iter() {
254 s.serialize_element(i.deref())?;
255 }
256 s.end()
257 }
258}
259
260#[cfg(test)]
263mod test {
264 use super::*;
265 use serde_json::{
266 from_str,
267 to_string,
268 };
269
270 quickcheck! {
271 fn ser_ordset(v: OrdSet<i32>) -> bool {
272 v == from_str::<OrdSet<i32>>(&to_string(&v).unwrap()).unwrap()
273 }
274
275 fn ser_ordmap(v: OrdMap<i32, i32>) -> bool {
276 v == from_str::<OrdMap<i32, i32>>(&to_string(&v).unwrap()).unwrap()
277 }
278
279
280 fn ser_vector(v: Vector<i32>) -> bool {
281 v == from_str::<Vector<i32>>(&to_string(&v).unwrap()).unwrap()
282 }
283 }
284}