iddqd/id_ord_map/
serde_impls.rs1use super::{IdOrdItem, IdOrdMap};
2use crate::support::size_hint::cautious;
3use core::{fmt, marker::PhantomData};
4use serde_core::{
5 Deserialize, Deserializer, Serialize, Serializer,
6 de::{MapAccess, SeqAccess, Visitor},
7 ser::{SerializeMap, SerializeSeq},
8};
9
10impl<T: IdOrdItem> Serialize for IdOrdMap<T>
61where
62 T: Serialize,
63{
64 fn serialize<S: Serializer>(
65 &self,
66 serializer: S,
67 ) -> Result<S::Ok, S::Error> {
68 let mut seq = serializer.serialize_seq(Some(self.len()))?;
69 for item in self {
70 seq.serialize_element(item)?;
71 }
72 seq.end()
73 }
74}
75
76impl<'de, T: IdOrdItem + fmt::Debug> Deserialize<'de> for IdOrdMap<T>
81where
82 T: Deserialize<'de>,
83{
84 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
85 where
86 D: Deserializer<'de>,
87 {
88 deserializer.deserialize_any(SeqVisitor { _marker: PhantomData })
89 }
90}
91
92struct SeqVisitor<T> {
93 _marker: PhantomData<fn() -> T>,
94}
95
96impl<'de, T> Visitor<'de> for SeqVisitor<T>
97where
98 T: IdOrdItem + Deserialize<'de> + fmt::Debug,
99{
100 type Value = IdOrdMap<T>;
101
102 fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
103 formatter
104 .write_str("a sequence or map of items representing an IdOrdMap")
105 }
106
107 fn visit_seq<Access>(
108 self,
109 mut seq: Access,
110 ) -> Result<Self::Value, Access::Error>
111 where
112 Access: SeqAccess<'de>,
113 {
114 let mut map = IdOrdMap::with_capacity(cautious::<T>(seq.size_hint()));
115
116 while let Some(element) = seq.next_element()? {
117 map.insert_unique(element)
118 .map_err(serde_core::de::Error::custom)?;
119 }
120
121 Ok(map)
122 }
123
124 fn visit_map<Access>(
125 self,
126 mut map_access: Access,
127 ) -> Result<Self::Value, Access::Error>
128 where
129 Access: MapAccess<'de>,
130 {
131 let mut map =
132 IdOrdMap::with_capacity(cautious::<T>(map_access.size_hint()));
133
134 while let Some((_, value)) =
135 map_access.next_entry::<serde_core::de::IgnoredAny, T>()?
136 {
137 map.insert_unique(value).map_err(serde_core::de::Error::custom)?;
138 }
139
140 Ok(map)
141 }
142}
143
144pub struct IdOrdMapAsMap<T> {
181 _marker: PhantomData<fn() -> T>,
182}
183
184struct MapVisitorAsMap<T> {
185 _marker: PhantomData<fn() -> T>,
186}
187
188impl<'de, T> Visitor<'de> for MapVisitorAsMap<T>
189where
190 T: IdOrdItem + Deserialize<'de> + fmt::Debug,
191{
192 type Value = IdOrdMap<T>;
193
194 fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
195 formatter.write_str("a map with items representing an IdOrdMap")
196 }
197
198 fn visit_map<Access>(
199 self,
200 mut map_access: Access,
201 ) -> Result<Self::Value, Access::Error>
202 where
203 Access: MapAccess<'de>,
204 {
205 let mut map =
206 IdOrdMap::with_capacity(cautious::<T>(map_access.size_hint()));
207
208 while let Some((_, value)) =
209 map_access.next_entry::<serde_core::de::IgnoredAny, T>()?
210 {
211 map.insert_unique(value).map_err(serde_core::de::Error::custom)?;
212 }
213
214 Ok(map)
215 }
216}
217
218impl<T> IdOrdMapAsMap<T> {
219 pub fn serialize<'a, Ser>(
221 map: &'a IdOrdMap<T>,
222 serializer: Ser,
223 ) -> Result<Ser::Ok, Ser::Error>
224 where
225 T: 'a + IdOrdItem + Serialize,
226 T::Key<'a>: Serialize,
227 Ser: Serializer,
228 {
229 let mut ser_map = serializer.serialize_map(Some(map.len()))?;
230 for item in map.iter() {
231 let key: T::Key<'a> = item.key();
234 ser_map.serialize_entry(&key, item)?;
235 }
236 ser_map.end()
237 }
238
239 pub fn deserialize<'de, D>(deserializer: D) -> Result<IdOrdMap<T>, D::Error>
241 where
242 T: IdOrdItem + Deserialize<'de> + fmt::Debug,
243 D: Deserializer<'de>,
244 {
245 deserializer.deserialize_map(MapVisitorAsMap { _marker: PhantomData })
246 }
247}