serde_hashkey/
ser.rs

1//! Serialization for serde-hashkey.
2
3use crate::error::Error;
4use serde::ser;
5use std::marker::PhantomData;
6
7use crate::float::{FloatPolicy, FloatRepr, RejectFloatPolicy};
8use crate::key::{Float, Key};
9
10/// Serialize the given value to a [Key].
11///
12/// # Examples
13///
14/// ```
15/// use serde_derive::{Deserialize, Serialize};
16/// use serde_hashkey::{from_key, to_key, Key};
17/// use std::collections::HashMap;
18///
19/// #[derive(Debug, PartialEq, Eq, Serialize, Deserialize)]
20/// struct Author {
21///     name: String,
22///     age: u32,
23/// }
24///
25/// #[derive(Debug, PartialEq, Eq, Serialize, Deserialize)]
26/// struct Book {
27///     title: String,
28///     author: Author,
29/// }
30///
31/// # fn main() -> serde_hashkey::Result<()> {
32/// let book = Book {
33///     title: String::from("Birds of a feather"),
34///     author: Author {
35///         name: String::from("Noah"),
36///         age: 42,
37///     },
38/// };
39///
40/// let key = to_key(&book)?;
41/// let book2 = from_key(&key)?;
42///
43/// assert_eq!(book, book2);
44/// # Ok(())
45/// # }
46/// ```
47pub fn to_key<T>(value: &T) -> Result<Key<RejectFloatPolicy>, Error>
48where
49    T: ser::Serialize,
50{
51    to_key_with_policy::<T, RejectFloatPolicy>(value)
52}
53
54/// Internal helper to serialize a value with the given policy.
55pub(crate) fn to_key_with_policy<T, F>(value: &T) -> Result<Key<F>, Error>
56where
57    T: ser::Serialize,
58    F: FloatPolicy,
59{
60    value.serialize(Serializer(PhantomData))
61}
62
63struct Serializer<F>(PhantomData<F>)
64where
65    F: FloatPolicy;
66
67impl<F> ser::Serializer for Serializer<F>
68where
69    F: FloatPolicy,
70{
71    type Ok = Key<F>;
72    type Error = Error;
73
74    type SerializeSeq = SerializeVec<F>;
75    type SerializeTuple = SerializeVec<F>;
76    type SerializeTupleStruct = SerializeVec<F>;
77    type SerializeTupleVariant = SerializeTupleVariant<F>;
78    type SerializeMap = SerializeMap<F>;
79    type SerializeStruct = SerializeMap<F>;
80    type SerializeStructVariant = SerializeStructVariant<F>;
81
82    #[inline]
83    fn serialize_bool(self, value: bool) -> Result<Key<F>, Error> {
84        Ok(Key::Bool(value))
85    }
86
87    #[inline]
88    fn serialize_i8(self, value: i8) -> Result<Key<F>, Error> {
89        Ok(value.into())
90    }
91
92    #[inline]
93    fn serialize_i16(self, value: i16) -> Result<Key<F>, Error> {
94        Ok(value.into())
95    }
96
97    #[inline]
98    fn serialize_i32(self, value: i32) -> Result<Key<F>, Error> {
99        Ok(value.into())
100    }
101
102    #[inline]
103    fn serialize_i64(self, value: i64) -> Result<Key<F>, Error> {
104        Ok(value.into())
105    }
106
107    fn serialize_i128(self, value: i128) -> Result<Key<F>, Error> {
108        Ok(value.into())
109    }
110
111    #[inline]
112    fn serialize_u8(self, value: u8) -> Result<Key<F>, Error> {
113        Ok(value.into())
114    }
115
116    #[inline]
117    fn serialize_u16(self, value: u16) -> Result<Key<F>, Error> {
118        Ok(value.into())
119    }
120
121    #[inline]
122    fn serialize_u32(self, value: u32) -> Result<Key<F>, Error> {
123        Ok(value.into())
124    }
125
126    #[inline]
127    fn serialize_u64(self, value: u64) -> Result<Key<F>, Error> {
128        Ok(value.into())
129    }
130
131    #[inline]
132    fn serialize_u128(self, value: u128) -> Result<Key<F>, Error> {
133        Ok(value.into())
134    }
135
136    #[inline]
137    fn serialize_f32(self, value: f32) -> Result<Key<F>, Error> {
138        Ok(Key::Float(Float::F32(
139            <F::F32 as FloatRepr<f32>>::serialize(value)?,
140        )))
141    }
142
143    #[inline]
144    fn serialize_f64(self, value: f64) -> Result<Key<F>, Error> {
145        Ok(Key::Float(Float::F64(
146            <F::F64 as FloatRepr<f64>>::serialize(value)?,
147        )))
148    }
149
150    #[inline]
151    fn serialize_char(self, value: char) -> Result<Key<F>, Error> {
152        let mut s = String::new();
153        s.push(value);
154        self.serialize_str(&s)
155    }
156
157    #[inline]
158    fn serialize_str(self, value: &str) -> Result<Key<F>, Error> {
159        Ok(Key::String(value.into()))
160    }
161
162    #[inline]
163    fn serialize_bytes(self, value: &[u8]) -> Result<Key<F>, Error> {
164        Ok(Key::Bytes(value.into()))
165    }
166
167    #[inline]
168    fn serialize_unit(self) -> Result<Key<F>, Error> {
169        Ok(Key::Unit)
170    }
171
172    #[inline]
173    fn serialize_unit_struct(self, _name: &'static str) -> Result<Key<F>, Error> {
174        self.serialize_unit()
175    }
176
177    #[inline]
178    fn serialize_unit_variant(
179        self,
180        _name: &'static str,
181        _variant_index: u32,
182        variant: &'static str,
183    ) -> Result<Key<F>, Error> {
184        self.serialize_str(variant)
185    }
186
187    #[inline]
188    fn serialize_newtype_struct<T: ?Sized>(
189        self,
190        _name: &'static str,
191        value: &T,
192    ) -> Result<Key<F>, Error>
193    where
194        T: ser::Serialize,
195    {
196        value.serialize(self)
197    }
198
199    fn serialize_newtype_variant<T: ?Sized>(
200        self,
201        _name: &'static str,
202        _variant_index: u32,
203        variant: &'static str,
204        value: &T,
205    ) -> Result<Key<F>, Error>
206    where
207        T: ser::Serialize,
208    {
209        let value = (Key::from(variant.to_owned()), to_key_with_policy(&value)?);
210        Ok(Key::Map([value].into()))
211    }
212
213    #[inline]
214    fn serialize_none(self) -> Result<Key<F>, Error> {
215        self.serialize_unit()
216    }
217
218    #[inline]
219    fn serialize_some<T: ?Sized>(self, value: &T) -> Result<Key<F>, Error>
220    where
221        T: ser::Serialize,
222    {
223        value.serialize(self)
224    }
225
226    fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Error> {
227        Ok(SerializeVec {
228            vec: Vec::with_capacity(len.unwrap_or(0)),
229        })
230    }
231
232    fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Error> {
233        self.serialize_seq(Some(len))
234    }
235
236    fn serialize_tuple_struct(
237        self,
238        _name: &'static str,
239        len: usize,
240    ) -> Result<Self::SerializeTupleStruct, Error> {
241        self.serialize_tuple(len)
242    }
243
244    fn serialize_tuple_variant(
245        self,
246        _name: &'static str,
247        _variant_index: u32,
248        variant: &'static str,
249        len: usize,
250    ) -> Result<Self::SerializeTupleVariant, Error> {
251        Ok(SerializeTupleVariant {
252            name: String::from(variant),
253            vec: Vec::with_capacity(len),
254        })
255    }
256
257    fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Error> {
258        Ok(SerializeMap {
259            map: Vec::new(),
260            next_key: None,
261        })
262    }
263
264    fn serialize_struct(
265        self,
266        _name: &'static str,
267        len: usize,
268    ) -> Result<Self::SerializeStruct, Error> {
269        self.serialize_map(Some(len))
270    }
271
272    fn serialize_struct_variant(
273        self,
274        _name: &'static str,
275        _variant_index: u32,
276        variant: &'static str,
277        _len: usize,
278    ) -> Result<Self::SerializeStructVariant, Error> {
279        Ok(SerializeStructVariant {
280            name: String::from(variant),
281            map: Vec::new(),
282        })
283    }
284
285    #[inline]
286    fn is_human_readable(&self) -> bool {
287        false
288    }
289}
290
291pub struct SerializeVec<F>
292where
293    F: FloatPolicy,
294{
295    vec: Vec<Key<F>>,
296}
297
298pub struct SerializeTupleVariant<F>
299where
300    F: FloatPolicy,
301{
302    name: String,
303    vec: Vec<Key<F>>,
304}
305
306pub struct SerializeMap<F>
307where
308    F: FloatPolicy,
309{
310    map: Vec<(Key<F>, Key<F>)>,
311    next_key: Option<Key<F>>,
312}
313
314pub struct SerializeStructVariant<F>
315where
316    F: FloatPolicy,
317{
318    name: String,
319    map: Vec<(Key<F>, Key<F>)>,
320}
321
322impl<F> ser::SerializeSeq for SerializeVec<F>
323where
324    F: FloatPolicy,
325{
326    type Ok = Key<F>;
327    type Error = Error;
328
329    fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Error>
330    where
331        T: ser::Serialize,
332    {
333        self.vec.push(to_key_with_policy(&value)?);
334        Ok(())
335    }
336
337    fn end(self) -> Result<Key<F>, Error> {
338        Ok(Key::Seq(self.vec.into()))
339    }
340}
341
342impl<F> ser::SerializeTuple for SerializeVec<F>
343where
344    F: FloatPolicy,
345{
346    type Ok = Key<F>;
347    type Error = Error;
348
349    fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Error>
350    where
351        T: ser::Serialize,
352    {
353        ser::SerializeSeq::serialize_element(self, value)
354    }
355
356    fn end(self) -> Result<Key<F>, Error> {
357        ser::SerializeSeq::end(self)
358    }
359}
360
361impl<F> ser::SerializeTupleStruct for SerializeVec<F>
362where
363    F: FloatPolicy,
364{
365    type Ok = Key<F>;
366    type Error = Error;
367
368    fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Error>
369    where
370        T: ser::Serialize,
371    {
372        ser::SerializeSeq::serialize_element(self, value)
373    }
374
375    fn end(self) -> Result<Key<F>, Error> {
376        ser::SerializeSeq::end(self)
377    }
378}
379
380impl<F> ser::SerializeTupleVariant for SerializeTupleVariant<F>
381where
382    F: FloatPolicy,
383{
384    type Ok = Key<F>;
385    type Error = Error;
386
387    fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Error>
388    where
389        T: ser::Serialize,
390    {
391        self.vec.push(to_key_with_policy(&value)?);
392        Ok(())
393    }
394
395    fn end(self) -> Result<Key<F>, Error> {
396        let value = (Key::from(self.name), Key::Seq(self.vec.into()));
397        Ok(Key::Map([value].into()))
398    }
399}
400
401impl<F> ser::SerializeMap for SerializeMap<F>
402where
403    F: FloatPolicy,
404{
405    type Ok = Key<F>;
406    type Error = Error;
407
408    fn serialize_key<T: ?Sized>(&mut self, key: &T) -> Result<(), Error>
409    where
410        T: ser::Serialize,
411    {
412        self.next_key = Some(to_key_with_policy(&key)?);
413        Ok(())
414    }
415
416    fn serialize_value<T: ?Sized>(&mut self, value: &T) -> Result<(), Error>
417    where
418        T: ser::Serialize,
419    {
420        let key = match self.next_key.take() {
421            Some(key) => key,
422            None => return Err(Error::MissingValue),
423        };
424
425        self.map.push((key, to_key_with_policy(&value)?));
426        Ok(())
427    }
428
429    fn end(self) -> Result<Key<F>, Error> {
430        Ok(Key::Map(self.map.into()))
431    }
432}
433
434impl<F> ser::SerializeStruct for SerializeMap<F>
435where
436    F: FloatPolicy,
437{
438    type Ok = Key<F>;
439    type Error = Error;
440
441    fn serialize_field<T: ?Sized>(&mut self, key: &'static str, value: &T) -> Result<(), Error>
442    where
443        T: ser::Serialize,
444    {
445        ser::SerializeMap::serialize_key(self, key)?;
446        ser::SerializeMap::serialize_value(self, value)
447    }
448
449    fn end(self) -> Result<Key<F>, Error> {
450        ser::SerializeMap::end(self)
451    }
452}
453
454impl<F> ser::SerializeStructVariant for SerializeStructVariant<F>
455where
456    F: FloatPolicy,
457{
458    type Ok = Key<F>;
459    type Error = Error;
460
461    fn serialize_field<T: ?Sized>(&mut self, key: &'static str, value: &T) -> Result<(), Error>
462    where
463        T: ser::Serialize,
464    {
465        self.map
466            .push((Key::from(String::from(key)), to_key_with_policy(&value)?));
467        Ok(())
468    }
469
470    fn end(self) -> Result<Key<F>, Error> {
471        let value = (Key::from(self.name), Key::Map(self.map.into()));
472        Ok(Key::Map([value].into()))
473    }
474}