simd_json/serde/
se.rs

1mod pp;
2use crate::{Error, ErrorType};
3pub use pp::*;
4use serde_ext::ser;
5use std::io::Write;
6use std::str;
7use value_trait::generator::BaseGenerator;
8
9macro_rules! iomap {
10    ($e:expr) => {
11        ($e).map_err(|err| Error::generic(ErrorType::Io(err)))
12    };
13}
14
15/// Write a value to a vector
16/// # Errors
17/// when the data can not be written
18#[cfg_attr(not(feature = "no-inline"), inline)]
19pub fn to_vec<T>(to: &T) -> crate::Result<Vec<u8>>
20where
21    T: ser::Serialize + ?Sized,
22{
23    let v = Vec::with_capacity(512);
24    let mut s = Serializer(v);
25    to.serialize(&mut s).map(|()| s.0)
26}
27
28/// Write a value to a string
29///
30/// # Errors
31/// when the data can not be written
32#[cfg_attr(not(feature = "no-inline"), inline)]
33pub fn to_string<T>(to: &T) -> crate::Result<String>
34where
35    T: ser::Serialize + ?Sized,
36{
37    to_vec(to).map(|v| unsafe { String::from_utf8_unchecked(v) })
38}
39
40/// Write a value to a string
41/// # Errors
42/// when the data can not be written
43#[cfg_attr(not(feature = "no-inline"), inline)]
44pub fn to_writer<T, W>(writer: W, to: &T) -> crate::Result<()>
45where
46    T: ser::Serialize + ?Sized,
47    W: Write,
48{
49    let mut s = Serializer(writer);
50    to.serialize(&mut s)
51}
52struct Serializer<W: Write>(W);
53
54impl<W> BaseGenerator for Serializer<W>
55where
56    W: Write,
57{
58    type T = W;
59    #[cfg_attr(not(feature = "no-inline"), inline)]
60    fn get_writer(&mut self) -> &mut Self::T {
61        &mut self.0
62    }
63    #[cfg_attr(not(feature = "no-inline"), inline)]
64    fn write_min(&mut self, _slice: &[u8], min: u8) -> std::io::Result<()> {
65        self.0.write_all(&[min])
66    }
67}
68struct SerializeSeq<'serializer, W: Write + 'serializer> {
69    s: &'serializer mut Serializer<W>,
70    first: bool,
71}
72impl<'serializer, W> ser::SerializeSeq for SerializeSeq<'serializer, W>
73where
74    W: Write,
75{
76    type Ok = ();
77    type Error = Error;
78    #[cfg_attr(not(feature = "no-inline"), inline)]
79    fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>
80    where
81        T: ?Sized + serde_ext::Serialize,
82    {
83        let SerializeSeq {
84            ref mut s,
85            ref mut first,
86            ..
87        } = *self;
88        if *first {
89            *first = false;
90            value.serialize(&mut **s)
91        } else {
92            iomap!(s.write(b",")).and_then(|()| value.serialize(&mut **s))
93        }
94    }
95    #[cfg_attr(not(feature = "no-inline"), inline)]
96    fn end(self) -> Result<Self::Ok, Self::Error> {
97        if self.first {
98            Ok(())
99        } else {
100            iomap!(self.s.write(b"]"))
101        }
102    }
103}
104
105impl<'serializer, W> ser::SerializeTuple for SerializeSeq<'serializer, W>
106where
107    W: Write,
108{
109    type Ok = ();
110    type Error = Error;
111    #[cfg_attr(not(feature = "no-inline"), inline)]
112    fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>
113    where
114        T: ?Sized + serde_ext::Serialize,
115    {
116        let SerializeSeq {
117            ref mut s,
118            ref mut first,
119        } = *self;
120        if *first {
121            *first = false;
122            value.serialize(&mut **s)
123        } else {
124            iomap!(s.write(b",")).and_then(|()| value.serialize(&mut **s))
125        }
126    }
127    #[cfg_attr(not(feature = "no-inline"), inline)]
128    fn end(self) -> Result<Self::Ok, Self::Error> {
129        if self.first {
130            Ok(())
131        } else {
132            iomap!(self.s.write(b"]"))
133        }
134    }
135}
136
137impl<'serializer, W> ser::SerializeTupleStruct for SerializeSeq<'serializer, W>
138where
139    W: Write,
140{
141    type Ok = ();
142    type Error = Error;
143    #[cfg_attr(not(feature = "no-inline"), inline)]
144    fn serialize_field<T>(&mut self, value: &T) -> Result<(), Self::Error>
145    where
146        T: ?Sized + serde_ext::Serialize,
147    {
148        let SerializeSeq {
149            ref mut s,
150            ref mut first,
151        } = *self;
152        if *first {
153            *first = false;
154            value.serialize(&mut **s)
155        } else {
156            iomap!(s.write(b",")).and_then(|()| value.serialize(&mut **s))
157        }
158    }
159    #[cfg_attr(not(feature = "no-inline"), inline)]
160    fn end(self) -> Result<Self::Ok, Self::Error> {
161        if self.first {
162            Ok(())
163        } else {
164            iomap!(self.s.write(b"]"))
165        }
166    }
167}
168
169impl<'serializer, W> ser::SerializeTupleVariant for SerializeSeq<'serializer, W>
170where
171    W: Write,
172{
173    type Ok = ();
174    type Error = Error;
175    #[cfg_attr(not(feature = "no-inline"), inline)]
176    fn serialize_field<T>(&mut self, value: &T) -> Result<(), Self::Error>
177    where
178        T: ?Sized + serde_ext::Serialize,
179    {
180        let SerializeSeq {
181            ref mut s,
182            ref mut first,
183        } = *self;
184        if *first {
185            *first = false;
186            value.serialize(&mut **s)
187        } else {
188            iomap!(s.write(b",")).and_then(|()| value.serialize(&mut **s))
189        }
190    }
191    #[cfg_attr(not(feature = "no-inline"), inline)]
192    fn end(self) -> Result<Self::Ok, Self::Error> {
193        if self.first {
194            Ok(())
195        } else {
196            iomap!(self.s.write(b"]}"))
197        }
198    }
199}
200
201struct SerializeMap<'serializer, W: Write + 'serializer> {
202    s: &'serializer mut Serializer<W>,
203    first: bool,
204    wrote_closing: bool,
205}
206
207impl<'serializer, W> ser::SerializeMap for SerializeMap<'serializer, W>
208where
209    W: Write,
210{
211    type Ok = ();
212    type Error = Error;
213    #[cfg_attr(not(feature = "no-inline"), inline)]
214    fn serialize_key<T>(&mut self, key: &T) -> Result<(), Self::Error>
215    where
216        T: ?Sized + serde_ext::Serialize,
217    {
218        let SerializeMap {
219            ref mut s,
220            ref mut first,
221            ..
222        } = *self;
223
224        if *first {
225            *first = false;
226            key.serialize(MapKeySerializer { s: &mut **s })
227                .and_then(|()| iomap!(s.write(b":")))
228        } else {
229            iomap!(s.write(b","))
230                .and_then(|()| key.serialize(MapKeySerializer { s: &mut **s }))
231                .and_then(|()| iomap!(s.write(b":")))
232        }
233    }
234    #[cfg_attr(not(feature = "no-inline"), inline)]
235    fn serialize_value<T>(&mut self, value: &T) -> Result<(), Self::Error>
236    where
237        T: ?Sized + serde_ext::Serialize,
238    {
239        let SerializeMap { ref mut s, .. } = *self;
240        value.serialize(&mut **s)
241    }
242    #[cfg_attr(not(feature = "no-inline"), inline)]
243    fn end(self) -> Result<Self::Ok, Self::Error> {
244        if self.wrote_closing {
245            Ok(())
246        } else {
247            iomap!(self.s.write(b"}"))
248        }
249    }
250}
251
252fn key_must_be_a_string() -> Error {
253    Error::generic(ErrorType::KeyMustBeAString)
254}
255
256struct MapKeySerializer<'serializer, W: Write + 'serializer> {
257    s: &'serializer mut Serializer<W>,
258}
259
260impl<'serializer, W> ser::Serializer for MapKeySerializer<'serializer, W>
261where
262    W: Write,
263{
264    type Ok = ();
265    type Error = Error;
266
267    #[cfg_attr(not(feature = "no-inline"), inline)]
268    fn serialize_str(self, value: &str) -> Result<(), Self::Error> {
269        self.s.serialize_str(value)
270    }
271
272    #[cfg_attr(not(feature = "no-inline"), inline)]
273    fn serialize_unit_variant(
274        self,
275        _name: &'static str,
276        _variant_index: u32,
277        variant: &'static str,
278    ) -> Result<(), Self::Error> {
279        self.s.serialize_str(variant)
280    }
281
282    #[cfg_attr(not(feature = "no-inline"), inline)]
283    fn serialize_newtype_struct<T>(self, _name: &'static str, value: &T) -> Result<(), Self::Error>
284    where
285        T: ?Sized + serde_ext::Serialize,
286    {
287        value.serialize(self)
288    }
289
290    type SerializeSeq = ser::Impossible<(), Error>;
291    type SerializeTuple = ser::Impossible<(), Error>;
292    type SerializeTupleStruct = ser::Impossible<(), Error>;
293    type SerializeTupleVariant = ser::Impossible<(), Error>;
294    type SerializeMap = ser::Impossible<(), Error>;
295    type SerializeStruct = ser::Impossible<(), Error>;
296    type SerializeStructVariant = ser::Impossible<(), Error>;
297
298    fn serialize_bool(self, _value: bool) -> Result<(), Self::Error> {
299        Err(key_must_be_a_string())
300    }
301
302    fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
303        iomap!(self
304            .s
305            .write_char(b'"')
306            .and_then(|()| self.s.write_int(v))
307            .and_then(|()| self.s.write_char(b'"')))
308    }
309
310    fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
311        iomap!(self
312            .s
313            .write_char(b'"')
314            .and_then(|()| self.s.write_int(v))
315            .and_then(|()| self.s.write_char(b'"')))
316    }
317
318    fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
319        iomap!(self
320            .s
321            .write_char(b'"')
322            .and_then(|()| self.s.write_int(v))
323            .and_then(|()| self.s.write_char(b'"')))
324    }
325
326    fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
327        iomap!(self
328            .s
329            .write_char(b'"')
330            .and_then(|()| self.s.write_int(v))
331            .and_then(|()| self.s.write_char(b'"')))
332    }
333
334    fn serialize_i128(self, v: i128) -> Result<Self::Ok, Self::Error> {
335        iomap!(self
336            .s
337            .write_char(b'"')
338            .and_then(|()| self.s.write_int(v))
339            .and_then(|()| self.s.write_char(b'"')))
340    }
341
342    fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
343        iomap!(self
344            .s
345            .write_char(b'"')
346            .and_then(|()| self.s.write_int(v))
347            .and_then(|()| self.s.write_char(b'"')))
348    }
349
350    fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
351        iomap!(self
352            .s
353            .write_char(b'"')
354            .and_then(|()| self.s.write_int(v))
355            .and_then(|()| self.s.write_char(b'"')))
356    }
357
358    fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
359        iomap!(self
360            .s
361            .write_char(b'"')
362            .and_then(|()| self.s.write_int(v))
363            .and_then(|()| self.s.write_char(b'"')))
364    }
365
366    fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
367        iomap!(self
368            .s
369            .write_char(b'"')
370            .and_then(|()| self.s.write_int(v))
371            .and_then(|()| self.s.write_char(b'"')))
372    }
373
374    fn serialize_u128(self, v: u128) -> Result<Self::Ok, Self::Error> {
375        iomap!(self
376            .s
377            .write_char(b'"')
378            .and_then(|()| self.s.write_int(v))
379            .and_then(|()| self.s.write_char(b'"')))
380    }
381
382    fn serialize_f32(self, _v: f32) -> Result<Self::Ok, Self::Error> {
383        Err(key_must_be_a_string())
384    }
385
386    fn serialize_f64(self, _v: f64) -> Result<Self::Ok, Self::Error> {
387        Err(key_must_be_a_string())
388    }
389
390    fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
391        self.s.serialize_str(&v.to_string())
392    }
393
394    fn serialize_bytes(self, _v: &[u8]) -> Result<Self::Ok, Self::Error> {
395        Err(key_must_be_a_string())
396    }
397
398    fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
399        Err(key_must_be_a_string())
400    }
401
402    fn serialize_some<T>(self, _value: &T) -> Result<Self::Ok, Self::Error>
403    where
404        T: ?Sized + serde_ext::Serialize,
405    {
406        Err(key_must_be_a_string())
407    }
408
409    fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
410        Err(key_must_be_a_string())
411    }
412
413    fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> {
414        Err(key_must_be_a_string())
415    }
416
417    fn serialize_newtype_variant<T>(
418        self,
419        _name: &'static str,
420        _variant_index: u32,
421        _variant: &'static str,
422        _value: &T,
423    ) -> Result<Self::Ok, Self::Error>
424    where
425        T: ?Sized + serde_ext::Serialize,
426    {
427        Err(key_must_be_a_string())
428    }
429
430    fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
431        Err(key_must_be_a_string())
432    }
433
434    fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, Self::Error> {
435        Err(key_must_be_a_string())
436    }
437
438    fn serialize_tuple_struct(
439        self,
440        _name: &'static str,
441        _len: usize,
442    ) -> Result<Self::SerializeTupleStruct, Self::Error> {
443        Err(key_must_be_a_string())
444    }
445
446    fn serialize_tuple_variant(
447        self,
448        _name: &'static str,
449        _variant_index: u32,
450        _variant: &'static str,
451        _len: usize,
452    ) -> Result<Self::SerializeTupleVariant, Self::Error> {
453        Err(key_must_be_a_string())
454    }
455
456    fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
457        Err(key_must_be_a_string())
458    }
459
460    fn serialize_struct(
461        self,
462        _name: &'static str,
463        _len: usize,
464    ) -> Result<Self::SerializeStruct, Self::Error> {
465        Err(key_must_be_a_string())
466    }
467
468    fn serialize_struct_variant(
469        self,
470        _name: &'static str,
471        _variant_index: u32,
472        _variant: &'static str,
473        _len: usize,
474    ) -> Result<Self::SerializeStructVariant, Self::Error> {
475        Err(key_must_be_a_string())
476    }
477}
478
479impl<'serializer, W> ser::SerializeStruct for SerializeMap<'serializer, W>
480where
481    W: Write,
482{
483    type Ok = ();
484    type Error = Error;
485    #[cfg_attr(not(feature = "no-inline"), inline)]
486    fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>
487    where
488        T: ?Sized + serde_ext::Serialize,
489    {
490        let SerializeMap {
491            ref mut s,
492            ref mut first,
493            ..
494        } = *self;
495        if *first {
496            *first = false;
497            iomap!(s.write_simple_string(key).and_then(|()| s.write(b":")))
498                .and_then(|()| value.serialize(&mut **s))
499        } else {
500            iomap!(s
501                .write(b",")
502                .and_then(|()| s.write_simple_string(key))
503                .and_then(|()| s.write(b":")))
504            .and_then(|()| value.serialize(&mut **s))
505        }
506    }
507    #[cfg_attr(not(feature = "no-inline"), inline)]
508    fn end(self) -> Result<Self::Ok, Self::Error> {
509        if self.first {
510            Ok(())
511        } else {
512            iomap!(self.s.write(b"}"))
513        }
514    }
515}
516
517struct SerializeStructVariant<'serializer, W: Write + 'serializer> {
518    s: &'serializer mut Serializer<W>,
519    first: bool,
520}
521
522impl<'serializer, W> ser::SerializeStructVariant for SerializeStructVariant<'serializer, W>
523where
524    W: Write,
525{
526    type Ok = ();
527    type Error = Error;
528    #[cfg_attr(not(feature = "no-inline"), inline)]
529    fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>
530    where
531        T: ?Sized + serde_ext::Serialize,
532    {
533        let SerializeStructVariant {
534            ref mut s,
535            ref mut first,
536            ..
537        } = *self;
538        if *first {
539            *first = false;
540            iomap!(s.write_simple_string(key).and_then(|()| s.write(b":")))
541                .and_then(|()| value.serialize(&mut **s))
542        } else {
543            iomap!(s
544                .write(b",")
545                .and_then(|()| s.write_simple_string(key))
546                .and_then(|()| s.write(b":")))
547            .and_then(|()| value.serialize(&mut **s))
548        }
549    }
550    #[cfg_attr(not(feature = "no-inline"), inline)]
551    fn end(self) -> Result<Self::Ok, Self::Error> {
552        iomap!(self.s.write(b"}")).and_then(move |()| {
553            if self.first {
554                Ok(())
555            } else {
556                iomap!(self.s.write(b"}"))
557            }
558        })
559    }
560}
561
562impl<'writer, W> ser::Serializer for &'writer mut Serializer<W>
563where
564    W: Write,
565{
566    type Ok = ();
567    type Error = Error;
568    type SerializeSeq = SerializeSeq<'writer, W>;
569    type SerializeTuple = SerializeSeq<'writer, W>;
570    type SerializeTupleStruct = SerializeSeq<'writer, W>;
571    type SerializeTupleVariant = SerializeSeq<'writer, W>;
572    type SerializeMap = SerializeMap<'writer, W>;
573    type SerializeStruct = SerializeMap<'writer, W>;
574    type SerializeStructVariant = SerializeStructVariant<'writer, W>;
575    #[cfg_attr(not(feature = "no-inline"), inline)]
576    fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
577        if v {
578            iomap!(self.write(b"true"))
579        } else {
580            iomap!(self.write(b"false"))
581        }
582    }
583    #[cfg_attr(not(feature = "no-inline"), inline)]
584    fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
585        iomap!(self.write_int(v))
586    }
587    #[cfg_attr(not(feature = "no-inline"), inline)]
588    fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
589        iomap!(self.write_int(v))
590    }
591    #[cfg_attr(not(feature = "no-inline"), inline)]
592    fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
593        iomap!(self.write_int(v))
594    }
595    #[cfg_attr(not(feature = "no-inline"), inline)]
596    fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
597        iomap!(self.write_int(v))
598    }
599    #[cfg_attr(not(feature = "no-inline"), inline)]
600    fn serialize_i128(self, v: i128) -> Result<Self::Ok, Self::Error> {
601        iomap!(self.write_int(v))
602    }
603    #[cfg_attr(not(feature = "no-inline"), inline)]
604    fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
605        iomap!(self.write_int(v))
606    }
607    #[cfg_attr(not(feature = "no-inline"), inline)]
608    fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
609        iomap!(self.write_int(v))
610    }
611    #[cfg_attr(not(feature = "no-inline"), inline)]
612    fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
613        iomap!(self.write_int(v))
614    }
615    #[cfg_attr(not(feature = "no-inline"), inline)]
616    fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
617        iomap!(self.write_int(v))
618    }
619    #[cfg_attr(not(feature = "no-inline"), inline)]
620    fn serialize_u128(self, v: u128) -> Result<Self::Ok, Self::Error> {
621        iomap!(self.write_int(v))
622    }
623
624    #[cfg_attr(not(feature = "no-inline"), inline)]
625    fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
626        iomap!(self.write_float(f64::from(v)))
627    }
628    #[cfg_attr(not(feature = "no-inline"), inline)]
629    fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
630        iomap!(self.write_float(v))
631    }
632    #[cfg_attr(not(feature = "no-inline"), inline)]
633    fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
634        // A char encoded as UTF-8 takes 4 bytes at most.
635        // taken from: https://docs.serde.rs/src/serde_json/ser.rs.html#213
636        let mut buf = [0; 4];
637        iomap!(self.write_simple_string(v.encode_utf8(&mut buf)))
638    }
639    #[cfg_attr(not(feature = "no-inline"), inline)]
640    fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
641        iomap!(self.write_string(v))
642    }
643    #[cfg_attr(not(feature = "no-inline"), inline)]
644    fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
645        iomap!(self.write(b"[").and_then(|()| {
646            if let Some((first, rest)) = v.split_first() {
647                self.write_int(*first).and_then(|()| {
648                    for v in rest {
649                        self.write(b",").and_then(|()| self.write_int(*v))?;
650                    }
651                    self.write(b"]")
652                })
653            } else {
654                self.write(b"]")
655            }
656        }))
657    }
658    #[cfg_attr(not(feature = "no-inline"), inline)]
659    fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
660        self.serialize_unit()
661    }
662    #[cfg_attr(not(feature = "no-inline"), inline)]
663    fn serialize_some<T>(self, value: &T) -> Result<Self::Ok, Self::Error>
664    where
665        T: ?Sized + serde_ext::Serialize,
666    {
667        value.serialize(self)
668    }
669    #[cfg_attr(not(feature = "no-inline"), inline)]
670    fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
671        iomap!(self.write(b"null"))
672    }
673    #[cfg_attr(not(feature = "no-inline"), inline)]
674    fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> {
675        self.serialize_unit()
676    }
677    #[cfg_attr(not(feature = "no-inline"), inline)]
678    fn serialize_unit_variant(
679        self,
680        _name: &'static str,
681        _variant_index: u32,
682        variant: &'static str,
683    ) -> Result<Self::Ok, Self::Error> {
684        iomap!(self.write_simple_string(variant))
685    }
686
687    #[cfg_attr(not(feature = "no-inline"), inline)]
688    fn serialize_newtype_struct<T>(
689        self,
690        _name: &'static str,
691        value: &T,
692    ) -> Result<Self::Ok, Self::Error>
693    where
694        T: ?Sized + serde_ext::Serialize,
695    {
696        value.serialize(self)
697    }
698
699    #[cfg_attr(not(feature = "no-inline"), inline)]
700    fn serialize_newtype_variant<T>(
701        self,
702        _name: &'static str,
703        _variant_index: u32,
704        variant: &'static str,
705        value: &T,
706    ) -> Result<Self::Ok, Self::Error>
707    where
708        T: ?Sized + serde_ext::Serialize,
709    {
710        iomap!(self
711            .write(b"{")
712            .and_then(|()| self.write_simple_string(variant))
713            .and_then(|()| self.write(b":")))
714        .and_then(|()| value.serialize(&mut *self))
715        .and_then(|()| iomap!(self.write(b"}")))
716    }
717    #[cfg_attr(not(feature = "no-inline"), inline)]
718    fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
719        if len == Some(0) {
720            iomap!(self.write(b"[]"))
721        } else {
722            iomap!(self.write(b"["))
723        }
724        .map(move |()| SerializeSeq {
725            s: self,
726            first: true,
727        })
728    }
729
730    #[cfg_attr(not(feature = "no-inline"), inline)]
731    fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error> {
732        self.serialize_seq(Some(len))
733    }
734
735    #[cfg_attr(not(feature = "no-inline"), inline)]
736    fn serialize_tuple_struct(
737        self,
738        _name: &'static str,
739        len: usize,
740    ) -> Result<Self::SerializeTupleStruct, Self::Error> {
741        self.serialize_seq(Some(len))
742    }
743
744    #[cfg_attr(not(feature = "no-inline"), inline)]
745    fn serialize_tuple_variant(
746        self,
747        _name: &'static str,
748        _variant_index: u32,
749        variant: &'static str,
750        len: usize,
751    ) -> Result<Self::SerializeTupleVariant, Self::Error> {
752        iomap!(self
753            .write(b"{")
754            .and_then(|()| self.write_simple_string(variant))
755            .and_then(|()| self.write(b":")))?;
756        self.serialize_seq(Some(len))
757    }
758
759    #[cfg_attr(not(feature = "no-inline"), inline)]
760    fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
761        let mut wrote_closing = false;
762        if len == Some(0) {
763            wrote_closing = true;
764            iomap!(self.write(b"{}"))
765        } else {
766            iomap!(self.write(b"{"))
767        }
768        .map(move |()| SerializeMap {
769            s: self,
770            first: true,
771            wrote_closing,
772        })
773    }
774
775    #[cfg_attr(not(feature = "no-inline"), inline)]
776    fn serialize_struct(
777        self,
778        _name: &'static str,
779        len: usize,
780    ) -> Result<Self::SerializeStruct, Self::Error> {
781        self.serialize_map(Some(len))
782    }
783
784    #[cfg_attr(not(feature = "no-inline"), inline)]
785    fn serialize_struct_variant(
786        self,
787        _name: &'static str,
788        _variant_index: u32,
789        variant: &'static str,
790        len: usize,
791    ) -> Result<Self::SerializeStructVariant, Self::Error> {
792        iomap!(self
793            .write(b"{")
794            .and_then(|()| self.write_simple_string(variant))
795            .and_then(|()| self.write(b":")))
796        .and_then(move |()| {
797            if len == 0 {
798                iomap!(self.write(b"{}"))
799            } else {
800                iomap!(self.write(b"{"))
801            }
802            .map(move |()| SerializeStructVariant {
803                s: self,
804                first: true,
805            })
806        })
807    }
808}
809
810#[cfg(test)]
811mod test {
812    #![allow(clippy::ignored_unit_patterns)]
813    #[cfg(not(target_arch = "wasm32"))]
814    use crate::{OwnedValue as Value, StaticNode};
815    #[cfg(not(target_arch = "wasm32"))]
816    use proptest::prelude::*;
817
818    #[test]
819    fn enum_tuple() {
820        #[derive(serde::Serialize, Clone)]
821        enum ErrType {
822            Instruction(i64, i64),
823        }
824
825        let err = ErrType::Instruction(2, 68800);
826
827        assert_eq!(
828            crate::to_string(&err).expect("failed to serialize"),
829            "{\"Instruction\":[2,68800]}",
830        );
831    }
832    #[test]
833    fn print_serde() {
834        #[derive(Clone, Debug, PartialEq, serde::Serialize)]
835        enum Segment {
836            Id { mid: usize },
837        }
838
839        assert_eq!(
840            "{\"Id\":{\"mid\":0}}",
841            crate::to_string(&Segment::Id { mid: 0 }).expect("to_string")
842        );
843    }
844
845    #[test]
846    fn numerical_map_serde() {
847        use std::collections::HashMap;
848
849        #[derive(Clone, Debug, PartialEq, serde::Serialize)]
850        struct Foo {
851            pub bar: HashMap<i32, i32>,
852        }
853
854        let mut foo = Foo {
855            bar: HashMap::new(),
856        };
857
858        foo.bar.insert(1337, 1337);
859
860        assert_eq!(
861            r#"{"bar":{"1337":1337}}"#,
862            crate::to_string(&foo).expect("to_string")
863        );
864    }
865
866    #[cfg(not(feature = "128bit"))]
867    #[cfg(not(target_arch = "wasm32"))]
868    fn arb_json_value() -> BoxedStrategy<Value> {
869        let leaf = prop_oneof![
870            Just(Value::Static(StaticNode::Null)),
871            any::<bool>().prop_map(Value::from),
872            //(-1.0e306f64..1.0e306f64).prop_map(Value::from), // damn you float!
873            any::<i8>().prop_map(Value::from),
874            any::<i16>().prop_map(Value::from),
875            any::<i32>().prop_map(Value::from),
876            any::<i64>().prop_map(Value::from),
877            any::<u8>().prop_map(Value::from),
878            any::<u16>().prop_map(Value::from),
879            any::<u32>().prop_map(Value::from),
880            any::<u64>().prop_map(Value::from),
881            ".*".prop_map(Value::from),
882        ];
883        leaf.prop_recursive(
884            8,   // 8 levels deep
885            256, // Shoot for maximum size of 256 nodes
886            10,  // We put up to 10 items per collection
887            |inner| {
888                prop_oneof![
889                    // Take the inner strategy and make the two recursive cases.
890                    prop::collection::vec(inner.clone(), 0..10).prop_map(Value::from),
891                    prop::collection::hash_map(".*", inner, 0..10).prop_map(Value::from),
892                ]
893            },
894        )
895        .boxed()
896    }
897
898    #[cfg(feature = "128bit")]
899    #[cfg(not(target_arch = "wasm32"))]
900    fn arb_json_value() -> BoxedStrategy<Value> {
901        let leaf = prop_oneof![
902            Just(Value::Static(StaticNode::Null)),
903            any::<bool>().prop_map(Value::from),
904            //(-1.0e306f64..1.0e306f64).prop_map(Value::from), // damn you float!
905            any::<i8>().prop_map(Value::from),
906            any::<i16>().prop_map(Value::from),
907            any::<i32>().prop_map(Value::from),
908            any::<i64>().prop_map(Value::from),
909            any::<i128>().prop_map(Value::from),
910            any::<u8>().prop_map(Value::from),
911            any::<u16>().prop_map(Value::from),
912            any::<u32>().prop_map(Value::from),
913            any::<u64>().prop_map(Value::from),
914            any::<u128>().prop_map(Value::from),
915            ".*".prop_map(Value::from),
916        ];
917        leaf.prop_recursive(
918            8,   // 8 levels deep
919            256, // Shoot for maximum size of 256 nodes
920            10,  // We put up to 10 items per collection
921            |inner| {
922                prop_oneof![
923                    // Take the inner strategy and make the two recursive cases.
924                    prop::collection::vec(inner.clone(), 0..10).prop_map(Value::from),
925                    prop::collection::hash_map(".*", inner, 0..10).prop_map(Value::from),
926                ]
927            },
928        )
929        .boxed()
930    }
931
932    #[cfg(not(target_arch = "wasm32"))]
933    proptest! {
934        #![proptest_config(ProptestConfig {
935            // Setting both fork and timeout is redundant since timeout implies
936            // fork, but both are shown for clarity.
937            // Disabled for code coverage, enable to track bugs
938            // fork: true,
939            .. ProptestConfig::default()
940        })]
941
942        #[test]
943        fn prop_json_encode_decode(val in arb_json_value()) {
944            let mut encoded = crate::to_vec(&val).expect("to_vec");
945            println!("{}", String::from_utf8_lossy(&encoded.clone()));
946            let res: Value = crate::from_slice(encoded.as_mut_slice()).expect("can't convert");
947            assert_eq!(val, res);
948        }
949    }
950}