simd_json/serde/se/
pp.rs

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