1use crate::error::{Error, ErrorCode, Result};
4use crate::io;
5use alloc::string::String;
6#[cfg(feature = "raw_value")]
7use alloc::string::ToString;
8use alloc::vec::Vec;
9use core::fmt::{self, Display};
10use core::hint;
11use core::num::FpCategory;
12use core::str;
13use serde::ser::{self, Impossible, Serialize};
14
15#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
17pub struct Serializer<W, F = CompactFormatter> {
18    writer: W,
19    formatter: F,
20}
21
22impl<W> Serializer<W>
23where
24    W: io::Write,
25{
26    #[inline]
28    pub fn new(writer: W) -> Self {
29        Serializer::with_formatter(writer, CompactFormatter)
30    }
31}
32
33impl<'a, W> Serializer<W, PrettyFormatter<'a>>
34where
35    W: io::Write,
36{
37    #[inline]
39    pub fn pretty(writer: W) -> Self {
40        Serializer::with_formatter(writer, PrettyFormatter::new())
41    }
42}
43
44impl<W, F> Serializer<W, F>
45where
46    W: io::Write,
47    F: Formatter,
48{
49    #[inline]
52    pub fn with_formatter(writer: W, formatter: F) -> Self {
53        Serializer { writer, formatter }
54    }
55
56    #[inline]
58    pub fn into_inner(self) -> W {
59        self.writer
60    }
61}
62
63impl<'a, W, F> ser::Serializer for &'a mut Serializer<W, F>
64where
65    W: io::Write,
66    F: Formatter,
67{
68    type Ok = ();
69    type Error = Error;
70
71    type SerializeSeq = Compound<'a, W, F>;
72    type SerializeTuple = Compound<'a, W, F>;
73    type SerializeTupleStruct = Compound<'a, W, F>;
74    type SerializeTupleVariant = Compound<'a, W, F>;
75    type SerializeMap = Compound<'a, W, F>;
76    type SerializeStruct = Compound<'a, W, F>;
77    type SerializeStructVariant = Compound<'a, W, F>;
78
79    #[inline]
80    fn serialize_bool(self, value: bool) -> Result<()> {
81        self.formatter
82            .write_bool(&mut self.writer, value)
83            .map_err(Error::io)
84    }
85
86    #[inline]
87    fn serialize_i8(self, value: i8) -> Result<()> {
88        self.formatter
89            .write_i8(&mut self.writer, value)
90            .map_err(Error::io)
91    }
92
93    #[inline]
94    fn serialize_i16(self, value: i16) -> Result<()> {
95        self.formatter
96            .write_i16(&mut self.writer, value)
97            .map_err(Error::io)
98    }
99
100    #[inline]
101    fn serialize_i32(self, value: i32) -> Result<()> {
102        self.formatter
103            .write_i32(&mut self.writer, value)
104            .map_err(Error::io)
105    }
106
107    #[inline]
108    fn serialize_i64(self, value: i64) -> Result<()> {
109        self.formatter
110            .write_i64(&mut self.writer, value)
111            .map_err(Error::io)
112    }
113
114    fn serialize_i128(self, value: i128) -> Result<()> {
115        self.formatter
116            .write_i128(&mut self.writer, value)
117            .map_err(Error::io)
118    }
119
120    #[inline]
121    fn serialize_u8(self, value: u8) -> Result<()> {
122        self.formatter
123            .write_u8(&mut self.writer, value)
124            .map_err(Error::io)
125    }
126
127    #[inline]
128    fn serialize_u16(self, value: u16) -> Result<()> {
129        self.formatter
130            .write_u16(&mut self.writer, value)
131            .map_err(Error::io)
132    }
133
134    #[inline]
135    fn serialize_u32(self, value: u32) -> Result<()> {
136        self.formatter
137            .write_u32(&mut self.writer, value)
138            .map_err(Error::io)
139    }
140
141    #[inline]
142    fn serialize_u64(self, value: u64) -> Result<()> {
143        self.formatter
144            .write_u64(&mut self.writer, value)
145            .map_err(Error::io)
146    }
147
148    fn serialize_u128(self, value: u128) -> Result<()> {
149        self.formatter
150            .write_u128(&mut self.writer, value)
151            .map_err(Error::io)
152    }
153
154    #[inline]
155    fn serialize_f32(self, value: f32) -> Result<()> {
156        match value.classify() {
157            FpCategory::Nan | FpCategory::Infinite => self
158                .formatter
159                .write_null(&mut self.writer)
160                .map_err(Error::io),
161            _ => self
162                .formatter
163                .write_f32(&mut self.writer, value)
164                .map_err(Error::io),
165        }
166    }
167
168    #[inline]
169    fn serialize_f64(self, value: f64) -> Result<()> {
170        match value.classify() {
171            FpCategory::Nan | FpCategory::Infinite => self
172                .formatter
173                .write_null(&mut self.writer)
174                .map_err(Error::io),
175            _ => self
176                .formatter
177                .write_f64(&mut self.writer, value)
178                .map_err(Error::io),
179        }
180    }
181
182    #[inline]
183    fn serialize_char(self, value: char) -> Result<()> {
184        let mut buf = [0; 4];
186        self.serialize_str(value.encode_utf8(&mut buf))
187    }
188
189    #[inline]
190    fn serialize_str(self, value: &str) -> Result<()> {
191        format_escaped_str(&mut self.writer, &mut self.formatter, value).map_err(Error::io)
192    }
193
194    #[inline]
195    fn serialize_bytes(self, value: &[u8]) -> Result<()> {
196        self.formatter
197            .write_byte_array(&mut self.writer, value)
198            .map_err(Error::io)
199    }
200
201    #[inline]
202    fn serialize_unit(self) -> Result<()> {
203        self.formatter
204            .write_null(&mut self.writer)
205            .map_err(Error::io)
206    }
207
208    #[inline]
209    fn serialize_unit_struct(self, _name: &'static str) -> Result<()> {
210        self.serialize_unit()
211    }
212
213    #[inline]
214    fn serialize_unit_variant(
215        self,
216        _name: &'static str,
217        _variant_index: u32,
218        variant: &'static str,
219    ) -> Result<()> {
220        self.serialize_str(variant)
221    }
222
223    #[inline]
225    fn serialize_newtype_struct<T>(self, _name: &'static str, value: &T) -> Result<()>
226    where
227        T: ?Sized + Serialize,
228    {
229        value.serialize(self)
230    }
231
232    #[inline]
233    fn serialize_newtype_variant<T>(
234        self,
235        _name: &'static str,
236        _variant_index: u32,
237        variant: &'static str,
238        value: &T,
239    ) -> Result<()>
240    where
241        T: ?Sized + Serialize,
242    {
243        tri!(self
244            .formatter
245            .begin_object(&mut self.writer)
246            .map_err(Error::io));
247        tri!(self
248            .formatter
249            .begin_object_key(&mut self.writer, true)
250            .map_err(Error::io));
251        tri!(self.serialize_str(variant));
252        tri!(self
253            .formatter
254            .end_object_key(&mut self.writer)
255            .map_err(Error::io));
256        tri!(self
257            .formatter
258            .begin_object_value(&mut self.writer)
259            .map_err(Error::io));
260        tri!(value.serialize(&mut *self));
261        tri!(self
262            .formatter
263            .end_object_value(&mut self.writer)
264            .map_err(Error::io));
265        self.formatter
266            .end_object(&mut self.writer)
267            .map_err(Error::io)
268    }
269
270    #[inline]
271    fn serialize_none(self) -> Result<()> {
272        self.serialize_unit()
273    }
274
275    #[inline]
276    fn serialize_some<T>(self, value: &T) -> Result<()>
277    where
278        T: ?Sized + Serialize,
279    {
280        value.serialize(self)
281    }
282
283    #[inline]
284    fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq> {
285        tri!(self
286            .formatter
287            .begin_array(&mut self.writer)
288            .map_err(Error::io));
289        if len == Some(0) {
290            tri!(self
291                .formatter
292                .end_array(&mut self.writer)
293                .map_err(Error::io));
294            Ok(Compound::Map {
295                ser: self,
296                state: State::Empty,
297            })
298        } else {
299            Ok(Compound::Map {
300                ser: self,
301                state: State::First,
302            })
303        }
304    }
305
306    #[inline]
307    fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple> {
308        self.serialize_seq(Some(len))
309    }
310
311    #[inline]
312    fn serialize_tuple_struct(
313        self,
314        _name: &'static str,
315        len: usize,
316    ) -> Result<Self::SerializeTupleStruct> {
317        self.serialize_seq(Some(len))
318    }
319
320    #[inline]
321    fn serialize_tuple_variant(
322        self,
323        _name: &'static str,
324        _variant_index: u32,
325        variant: &'static str,
326        len: usize,
327    ) -> Result<Self::SerializeTupleVariant> {
328        tri!(self
329            .formatter
330            .begin_object(&mut self.writer)
331            .map_err(Error::io));
332        tri!(self
333            .formatter
334            .begin_object_key(&mut self.writer, true)
335            .map_err(Error::io));
336        tri!(self.serialize_str(variant));
337        tri!(self
338            .formatter
339            .end_object_key(&mut self.writer)
340            .map_err(Error::io));
341        tri!(self
342            .formatter
343            .begin_object_value(&mut self.writer)
344            .map_err(Error::io));
345        self.serialize_seq(Some(len))
346    }
347
348    #[inline]
349    fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap> {
350        tri!(self
351            .formatter
352            .begin_object(&mut self.writer)
353            .map_err(Error::io));
354        if len == Some(0) {
355            tri!(self
356                .formatter
357                .end_object(&mut self.writer)
358                .map_err(Error::io));
359            Ok(Compound::Map {
360                ser: self,
361                state: State::Empty,
362            })
363        } else {
364            Ok(Compound::Map {
365                ser: self,
366                state: State::First,
367            })
368        }
369    }
370
371    #[inline]
372    fn serialize_struct(self, name: &'static str, len: usize) -> Result<Self::SerializeStruct> {
373        match name {
374            #[cfg(feature = "arbitrary_precision")]
375            crate::number::TOKEN => Ok(Compound::Number { ser: self }),
376            #[cfg(feature = "raw_value")]
377            crate::raw::TOKEN => Ok(Compound::RawValue { ser: self }),
378            _ => self.serialize_map(Some(len)),
379        }
380    }
381
382    #[inline]
383    fn serialize_struct_variant(
384        self,
385        _name: &'static str,
386        _variant_index: u32,
387        variant: &'static str,
388        len: usize,
389    ) -> Result<Self::SerializeStructVariant> {
390        tri!(self
391            .formatter
392            .begin_object(&mut self.writer)
393            .map_err(Error::io));
394        tri!(self
395            .formatter
396            .begin_object_key(&mut self.writer, true)
397            .map_err(Error::io));
398        tri!(self.serialize_str(variant));
399        tri!(self
400            .formatter
401            .end_object_key(&mut self.writer)
402            .map_err(Error::io));
403        tri!(self
404            .formatter
405            .begin_object_value(&mut self.writer)
406            .map_err(Error::io));
407        self.serialize_map(Some(len))
408    }
409
410    fn collect_str<T>(self, value: &T) -> Result<()>
411    where
412        T: ?Sized + Display,
413    {
414        use self::fmt::Write;
415
416        struct Adapter<'ser, W: 'ser, F: 'ser> {
417            writer: &'ser mut W,
418            formatter: &'ser mut F,
419            error: Option<io::Error>,
420        }
421
422        impl<'ser, W, F> Write for Adapter<'ser, W, F>
423        where
424            W: io::Write,
425            F: Formatter,
426        {
427            fn write_str(&mut self, s: &str) -> fmt::Result {
428                debug_assert!(self.error.is_none());
429                match format_escaped_str_contents(self.writer, self.formatter, s) {
430                    Ok(()) => Ok(()),
431                    Err(err) => {
432                        self.error = Some(err);
433                        Err(fmt::Error)
434                    }
435                }
436            }
437        }
438
439        tri!(self
440            .formatter
441            .begin_string(&mut self.writer)
442            .map_err(Error::io));
443        let mut adapter = Adapter {
444            writer: &mut self.writer,
445            formatter: &mut self.formatter,
446            error: None,
447        };
448        match write!(adapter, "{}", value) {
449            Ok(()) => debug_assert!(adapter.error.is_none()),
450            Err(fmt::Error) => {
451                return Err(Error::io(adapter.error.expect("there should be an error")));
452            }
453        }
454        self.formatter
455            .end_string(&mut self.writer)
456            .map_err(Error::io)
457    }
458}
459
460#[doc(hidden)]
462#[derive(Eq, PartialEq)]
463pub enum State {
464    Empty,
465    First,
466    Rest,
467}
468
469#[doc(hidden)]
471pub enum Compound<'a, W: 'a, F: 'a> {
472    Map {
473        ser: &'a mut Serializer<W, F>,
474        state: State,
475    },
476    #[cfg(feature = "arbitrary_precision")]
477    Number { ser: &'a mut Serializer<W, F> },
478    #[cfg(feature = "raw_value")]
479    RawValue { ser: &'a mut Serializer<W, F> },
480}
481
482impl<'a, W, F> ser::SerializeSeq for Compound<'a, W, F>
483where
484    W: io::Write,
485    F: Formatter,
486{
487    type Ok = ();
488    type Error = Error;
489
490    #[inline]
491    fn serialize_element<T>(&mut self, value: &T) -> Result<()>
492    where
493        T: ?Sized + Serialize,
494    {
495        match self {
496            Compound::Map { ser, state } => {
497                tri!(ser
498                    .formatter
499                    .begin_array_value(&mut ser.writer, *state == State::First)
500                    .map_err(Error::io));
501                *state = State::Rest;
502                tri!(value.serialize(&mut **ser));
503                ser.formatter
504                    .end_array_value(&mut ser.writer)
505                    .map_err(Error::io)
506            }
507            #[cfg(feature = "arbitrary_precision")]
508            Compound::Number { .. } => unreachable!(),
509            #[cfg(feature = "raw_value")]
510            Compound::RawValue { .. } => unreachable!(),
511        }
512    }
513
514    #[inline]
515    fn end(self) -> Result<()> {
516        match self {
517            Compound::Map { ser, state } => match state {
518                State::Empty => Ok(()),
519                _ => ser.formatter.end_array(&mut ser.writer).map_err(Error::io),
520            },
521            #[cfg(feature = "arbitrary_precision")]
522            Compound::Number { .. } => unreachable!(),
523            #[cfg(feature = "raw_value")]
524            Compound::RawValue { .. } => unreachable!(),
525        }
526    }
527}
528
529impl<'a, W, F> ser::SerializeTuple for Compound<'a, W, F>
530where
531    W: io::Write,
532    F: Formatter,
533{
534    type Ok = ();
535    type Error = Error;
536
537    #[inline]
538    fn serialize_element<T>(&mut self, value: &T) -> Result<()>
539    where
540        T: ?Sized + Serialize,
541    {
542        ser::SerializeSeq::serialize_element(self, value)
543    }
544
545    #[inline]
546    fn end(self) -> Result<()> {
547        ser::SerializeSeq::end(self)
548    }
549}
550
551impl<'a, W, F> ser::SerializeTupleStruct for Compound<'a, W, F>
552where
553    W: io::Write,
554    F: Formatter,
555{
556    type Ok = ();
557    type Error = Error;
558
559    #[inline]
560    fn serialize_field<T>(&mut self, value: &T) -> Result<()>
561    where
562        T: ?Sized + Serialize,
563    {
564        ser::SerializeSeq::serialize_element(self, value)
565    }
566
567    #[inline]
568    fn end(self) -> Result<()> {
569        ser::SerializeSeq::end(self)
570    }
571}
572
573impl<'a, W, F> ser::SerializeTupleVariant for Compound<'a, W, F>
574where
575    W: io::Write,
576    F: Formatter,
577{
578    type Ok = ();
579    type Error = Error;
580
581    #[inline]
582    fn serialize_field<T>(&mut self, value: &T) -> Result<()>
583    where
584        T: ?Sized + Serialize,
585    {
586        ser::SerializeSeq::serialize_element(self, value)
587    }
588
589    #[inline]
590    fn end(self) -> Result<()> {
591        match self {
592            Compound::Map { ser, state } => {
593                match state {
594                    State::Empty => {}
595                    _ => tri!(ser.formatter.end_array(&mut ser.writer).map_err(Error::io)),
596                }
597                tri!(ser
598                    .formatter
599                    .end_object_value(&mut ser.writer)
600                    .map_err(Error::io));
601                ser.formatter.end_object(&mut ser.writer).map_err(Error::io)
602            }
603            #[cfg(feature = "arbitrary_precision")]
604            Compound::Number { .. } => unreachable!(),
605            #[cfg(feature = "raw_value")]
606            Compound::RawValue { .. } => unreachable!(),
607        }
608    }
609}
610
611impl<'a, W, F> ser::SerializeMap for Compound<'a, W, F>
612where
613    W: io::Write,
614    F: Formatter,
615{
616    type Ok = ();
617    type Error = Error;
618
619    #[inline]
620    fn serialize_key<T>(&mut self, key: &T) -> Result<()>
621    where
622        T: ?Sized + Serialize,
623    {
624        match self {
625            Compound::Map { ser, state } => {
626                tri!(ser
627                    .formatter
628                    .begin_object_key(&mut ser.writer, *state == State::First)
629                    .map_err(Error::io));
630                *state = State::Rest;
631
632                tri!(key.serialize(MapKeySerializer { ser: *ser }));
633
634                ser.formatter
635                    .end_object_key(&mut ser.writer)
636                    .map_err(Error::io)
637            }
638            #[cfg(feature = "arbitrary_precision")]
639            Compound::Number { .. } => unreachable!(),
640            #[cfg(feature = "raw_value")]
641            Compound::RawValue { .. } => unreachable!(),
642        }
643    }
644
645    #[inline]
646    fn serialize_value<T>(&mut self, value: &T) -> Result<()>
647    where
648        T: ?Sized + Serialize,
649    {
650        match self {
651            Compound::Map { ser, .. } => {
652                tri!(ser
653                    .formatter
654                    .begin_object_value(&mut ser.writer)
655                    .map_err(Error::io));
656                tri!(value.serialize(&mut **ser));
657                ser.formatter
658                    .end_object_value(&mut ser.writer)
659                    .map_err(Error::io)
660            }
661            #[cfg(feature = "arbitrary_precision")]
662            Compound::Number { .. } => unreachable!(),
663            #[cfg(feature = "raw_value")]
664            Compound::RawValue { .. } => unreachable!(),
665        }
666    }
667
668    #[inline]
669    fn end(self) -> Result<()> {
670        match self {
671            Compound::Map { ser, state } => match state {
672                State::Empty => Ok(()),
673                _ => ser.formatter.end_object(&mut ser.writer).map_err(Error::io),
674            },
675            #[cfg(feature = "arbitrary_precision")]
676            Compound::Number { .. } => unreachable!(),
677            #[cfg(feature = "raw_value")]
678            Compound::RawValue { .. } => unreachable!(),
679        }
680    }
681}
682
683impl<'a, W, F> ser::SerializeStruct for Compound<'a, W, F>
684where
685    W: io::Write,
686    F: Formatter,
687{
688    type Ok = ();
689    type Error = Error;
690
691    #[inline]
692    fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<()>
693    where
694        T: ?Sized + Serialize,
695    {
696        match self {
697            Compound::Map { .. } => ser::SerializeMap::serialize_entry(self, key, value),
698            #[cfg(feature = "arbitrary_precision")]
699            Compound::Number { ser, .. } => {
700                if key == crate::number::TOKEN {
701                    value.serialize(NumberStrEmitter(ser))
702                } else {
703                    Err(invalid_number())
704                }
705            }
706            #[cfg(feature = "raw_value")]
707            Compound::RawValue { ser, .. } => {
708                if key == crate::raw::TOKEN {
709                    value.serialize(RawValueStrEmitter(ser))
710                } else {
711                    Err(invalid_raw_value())
712                }
713            }
714        }
715    }
716
717    #[inline]
718    fn end(self) -> Result<()> {
719        match self {
720            Compound::Map { .. } => ser::SerializeMap::end(self),
721            #[cfg(feature = "arbitrary_precision")]
722            Compound::Number { .. } => Ok(()),
723            #[cfg(feature = "raw_value")]
724            Compound::RawValue { .. } => Ok(()),
725        }
726    }
727}
728
729impl<'a, W, F> ser::SerializeStructVariant for Compound<'a, W, F>
730where
731    W: io::Write,
732    F: Formatter,
733{
734    type Ok = ();
735    type Error = Error;
736
737    #[inline]
738    fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<()>
739    where
740        T: ?Sized + Serialize,
741    {
742        match *self {
743            Compound::Map { .. } => ser::SerializeStruct::serialize_field(self, key, value),
744            #[cfg(feature = "arbitrary_precision")]
745            Compound::Number { .. } => unreachable!(),
746            #[cfg(feature = "raw_value")]
747            Compound::RawValue { .. } => unreachable!(),
748        }
749    }
750
751    #[inline]
752    fn end(self) -> Result<()> {
753        match self {
754            Compound::Map { ser, state } => {
755                match state {
756                    State::Empty => {}
757                    _ => tri!(ser.formatter.end_object(&mut ser.writer).map_err(Error::io)),
758                }
759                tri!(ser
760                    .formatter
761                    .end_object_value(&mut ser.writer)
762                    .map_err(Error::io));
763                ser.formatter.end_object(&mut ser.writer).map_err(Error::io)
764            }
765            #[cfg(feature = "arbitrary_precision")]
766            Compound::Number { .. } => unreachable!(),
767            #[cfg(feature = "raw_value")]
768            Compound::RawValue { .. } => unreachable!(),
769        }
770    }
771}
772
773struct MapKeySerializer<'a, W: 'a, F: 'a> {
774    ser: &'a mut Serializer<W, F>,
775}
776
777#[cfg(feature = "arbitrary_precision")]
778fn invalid_number() -> Error {
779    Error::syntax(ErrorCode::InvalidNumber, 0, 0)
780}
781
782#[cfg(feature = "raw_value")]
783fn invalid_raw_value() -> Error {
784    Error::syntax(ErrorCode::ExpectedSomeValue, 0, 0)
785}
786
787fn key_must_be_a_string() -> Error {
788    Error::syntax(ErrorCode::KeyMustBeAString, 0, 0)
789}
790
791fn float_key_must_be_finite() -> Error {
792    Error::syntax(ErrorCode::FloatKeyMustBeFinite, 0, 0)
793}
794
795impl<'a, W, F> ser::Serializer for MapKeySerializer<'a, W, F>
796where
797    W: io::Write,
798    F: Formatter,
799{
800    type Ok = ();
801    type Error = Error;
802
803    #[inline]
804    fn serialize_str(self, value: &str) -> Result<()> {
805        self.ser.serialize_str(value)
806    }
807
808    #[inline]
809    fn serialize_unit_variant(
810        self,
811        _name: &'static str,
812        _variant_index: u32,
813        variant: &'static str,
814    ) -> Result<()> {
815        self.ser.serialize_str(variant)
816    }
817
818    #[inline]
819    fn serialize_newtype_struct<T>(self, _name: &'static str, value: &T) -> Result<()>
820    where
821        T: ?Sized + Serialize,
822    {
823        value.serialize(self)
824    }
825
826    type SerializeSeq = Impossible<(), Error>;
827    type SerializeTuple = Impossible<(), Error>;
828    type SerializeTupleStruct = Impossible<(), Error>;
829    type SerializeTupleVariant = Impossible<(), Error>;
830    type SerializeMap = Impossible<(), Error>;
831    type SerializeStruct = Impossible<(), Error>;
832    type SerializeStructVariant = Impossible<(), Error>;
833
834    fn serialize_bool(self, value: bool) -> Result<()> {
835        tri!(self
836            .ser
837            .formatter
838            .begin_string(&mut self.ser.writer)
839            .map_err(Error::io));
840        tri!(self
841            .ser
842            .formatter
843            .write_bool(&mut self.ser.writer, value)
844            .map_err(Error::io));
845        self.ser
846            .formatter
847            .end_string(&mut self.ser.writer)
848            .map_err(Error::io)
849    }
850
851    fn serialize_i8(self, value: i8) -> Result<()> {
852        tri!(self
853            .ser
854            .formatter
855            .begin_string(&mut self.ser.writer)
856            .map_err(Error::io));
857        tri!(self
858            .ser
859            .formatter
860            .write_i8(&mut self.ser.writer, value)
861            .map_err(Error::io));
862        self.ser
863            .formatter
864            .end_string(&mut self.ser.writer)
865            .map_err(Error::io)
866    }
867
868    fn serialize_i16(self, value: i16) -> Result<()> {
869        tri!(self
870            .ser
871            .formatter
872            .begin_string(&mut self.ser.writer)
873            .map_err(Error::io));
874        tri!(self
875            .ser
876            .formatter
877            .write_i16(&mut self.ser.writer, value)
878            .map_err(Error::io));
879        self.ser
880            .formatter
881            .end_string(&mut self.ser.writer)
882            .map_err(Error::io)
883    }
884
885    fn serialize_i32(self, value: i32) -> Result<()> {
886        tri!(self
887            .ser
888            .formatter
889            .begin_string(&mut self.ser.writer)
890            .map_err(Error::io));
891        tri!(self
892            .ser
893            .formatter
894            .write_i32(&mut self.ser.writer, value)
895            .map_err(Error::io));
896        self.ser
897            .formatter
898            .end_string(&mut self.ser.writer)
899            .map_err(Error::io)
900    }
901
902    fn serialize_i64(self, value: i64) -> Result<()> {
903        tri!(self
904            .ser
905            .formatter
906            .begin_string(&mut self.ser.writer)
907            .map_err(Error::io));
908        tri!(self
909            .ser
910            .formatter
911            .write_i64(&mut self.ser.writer, value)
912            .map_err(Error::io));
913        self.ser
914            .formatter
915            .end_string(&mut self.ser.writer)
916            .map_err(Error::io)
917    }
918
919    fn serialize_i128(self, value: i128) -> Result<()> {
920        tri!(self
921            .ser
922            .formatter
923            .begin_string(&mut self.ser.writer)
924            .map_err(Error::io));
925        tri!(self
926            .ser
927            .formatter
928            .write_i128(&mut self.ser.writer, value)
929            .map_err(Error::io));
930        self.ser
931            .formatter
932            .end_string(&mut self.ser.writer)
933            .map_err(Error::io)
934    }
935
936    fn serialize_u8(self, value: u8) -> Result<()> {
937        tri!(self
938            .ser
939            .formatter
940            .begin_string(&mut self.ser.writer)
941            .map_err(Error::io));
942        tri!(self
943            .ser
944            .formatter
945            .write_u8(&mut self.ser.writer, value)
946            .map_err(Error::io));
947        self.ser
948            .formatter
949            .end_string(&mut self.ser.writer)
950            .map_err(Error::io)
951    }
952
953    fn serialize_u16(self, value: u16) -> Result<()> {
954        tri!(self
955            .ser
956            .formatter
957            .begin_string(&mut self.ser.writer)
958            .map_err(Error::io));
959        tri!(self
960            .ser
961            .formatter
962            .write_u16(&mut self.ser.writer, value)
963            .map_err(Error::io));
964        self.ser
965            .formatter
966            .end_string(&mut self.ser.writer)
967            .map_err(Error::io)
968    }
969
970    fn serialize_u32(self, value: u32) -> Result<()> {
971        tri!(self
972            .ser
973            .formatter
974            .begin_string(&mut self.ser.writer)
975            .map_err(Error::io));
976        tri!(self
977            .ser
978            .formatter
979            .write_u32(&mut self.ser.writer, value)
980            .map_err(Error::io));
981        self.ser
982            .formatter
983            .end_string(&mut self.ser.writer)
984            .map_err(Error::io)
985    }
986
987    fn serialize_u64(self, value: u64) -> Result<()> {
988        tri!(self
989            .ser
990            .formatter
991            .begin_string(&mut self.ser.writer)
992            .map_err(Error::io));
993        tri!(self
994            .ser
995            .formatter
996            .write_u64(&mut self.ser.writer, value)
997            .map_err(Error::io));
998        self.ser
999            .formatter
1000            .end_string(&mut self.ser.writer)
1001            .map_err(Error::io)
1002    }
1003
1004    fn serialize_u128(self, value: u128) -> Result<()> {
1005        tri!(self
1006            .ser
1007            .formatter
1008            .begin_string(&mut self.ser.writer)
1009            .map_err(Error::io));
1010        tri!(self
1011            .ser
1012            .formatter
1013            .write_u128(&mut self.ser.writer, value)
1014            .map_err(Error::io));
1015        self.ser
1016            .formatter
1017            .end_string(&mut self.ser.writer)
1018            .map_err(Error::io)
1019    }
1020
1021    fn serialize_f32(self, value: f32) -> Result<()> {
1022        if !value.is_finite() {
1023            return Err(float_key_must_be_finite());
1024        }
1025
1026        tri!(self
1027            .ser
1028            .formatter
1029            .begin_string(&mut self.ser.writer)
1030            .map_err(Error::io));
1031        tri!(self
1032            .ser
1033            .formatter
1034            .write_f32(&mut self.ser.writer, value)
1035            .map_err(Error::io));
1036        self.ser
1037            .formatter
1038            .end_string(&mut self.ser.writer)
1039            .map_err(Error::io)
1040    }
1041
1042    fn serialize_f64(self, value: f64) -> Result<()> {
1043        if !value.is_finite() {
1044            return Err(float_key_must_be_finite());
1045        }
1046
1047        tri!(self
1048            .ser
1049            .formatter
1050            .begin_string(&mut self.ser.writer)
1051            .map_err(Error::io));
1052        tri!(self
1053            .ser
1054            .formatter
1055            .write_f64(&mut self.ser.writer, value)
1056            .map_err(Error::io));
1057        self.ser
1058            .formatter
1059            .end_string(&mut self.ser.writer)
1060            .map_err(Error::io)
1061    }
1062
1063    fn serialize_char(self, value: char) -> Result<()> {
1064        self.ser.serialize_str(value.encode_utf8(&mut [0u8; 4]))
1065    }
1066
1067    fn serialize_bytes(self, _value: &[u8]) -> Result<()> {
1068        Err(key_must_be_a_string())
1069    }
1070
1071    fn serialize_unit(self) -> Result<()> {
1072        Err(key_must_be_a_string())
1073    }
1074
1075    fn serialize_unit_struct(self, _name: &'static str) -> Result<()> {
1076        Err(key_must_be_a_string())
1077    }
1078
1079    fn serialize_newtype_variant<T>(
1080        self,
1081        _name: &'static str,
1082        _variant_index: u32,
1083        _variant: &'static str,
1084        _value: &T,
1085    ) -> Result<()>
1086    where
1087        T: ?Sized + Serialize,
1088    {
1089        Err(key_must_be_a_string())
1090    }
1091
1092    fn serialize_none(self) -> Result<()> {
1093        Err(key_must_be_a_string())
1094    }
1095
1096    fn serialize_some<T>(self, value: &T) -> Result<()>
1097    where
1098        T: ?Sized + Serialize,
1099    {
1100        value.serialize(self)
1101    }
1102
1103    fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq> {
1104        Err(key_must_be_a_string())
1105    }
1106
1107    fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple> {
1108        Err(key_must_be_a_string())
1109    }
1110
1111    fn serialize_tuple_struct(
1112        self,
1113        _name: &'static str,
1114        _len: usize,
1115    ) -> Result<Self::SerializeTupleStruct> {
1116        Err(key_must_be_a_string())
1117    }
1118
1119    fn serialize_tuple_variant(
1120        self,
1121        _name: &'static str,
1122        _variant_index: u32,
1123        _variant: &'static str,
1124        _len: usize,
1125    ) -> Result<Self::SerializeTupleVariant> {
1126        Err(key_must_be_a_string())
1127    }
1128
1129    fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap> {
1130        Err(key_must_be_a_string())
1131    }
1132
1133    fn serialize_struct(self, _name: &'static str, _len: usize) -> Result<Self::SerializeStruct> {
1134        Err(key_must_be_a_string())
1135    }
1136
1137    fn serialize_struct_variant(
1138        self,
1139        _name: &'static str,
1140        _variant_index: u32,
1141        _variant: &'static str,
1142        _len: usize,
1143    ) -> Result<Self::SerializeStructVariant> {
1144        Err(key_must_be_a_string())
1145    }
1146
1147    fn collect_str<T>(self, value: &T) -> Result<()>
1148    where
1149        T: ?Sized + Display,
1150    {
1151        self.ser.collect_str(value)
1152    }
1153}
1154
1155#[cfg(feature = "arbitrary_precision")]
1156struct NumberStrEmitter<'a, W: 'a + io::Write, F: 'a + Formatter>(&'a mut Serializer<W, F>);
1157
1158#[cfg(feature = "arbitrary_precision")]
1159impl<'a, W: io::Write, F: Formatter> ser::Serializer for NumberStrEmitter<'a, W, F> {
1160    type Ok = ();
1161    type Error = Error;
1162
1163    type SerializeSeq = Impossible<(), Error>;
1164    type SerializeTuple = Impossible<(), Error>;
1165    type SerializeTupleStruct = Impossible<(), Error>;
1166    type SerializeTupleVariant = Impossible<(), Error>;
1167    type SerializeMap = Impossible<(), Error>;
1168    type SerializeStruct = Impossible<(), Error>;
1169    type SerializeStructVariant = Impossible<(), Error>;
1170
1171    fn serialize_bool(self, _v: bool) -> Result<()> {
1172        Err(invalid_number())
1173    }
1174
1175    fn serialize_i8(self, _v: i8) -> Result<()> {
1176        Err(invalid_number())
1177    }
1178
1179    fn serialize_i16(self, _v: i16) -> Result<()> {
1180        Err(invalid_number())
1181    }
1182
1183    fn serialize_i32(self, _v: i32) -> Result<()> {
1184        Err(invalid_number())
1185    }
1186
1187    fn serialize_i64(self, _v: i64) -> Result<()> {
1188        Err(invalid_number())
1189    }
1190
1191    fn serialize_i128(self, _v: i128) -> Result<()> {
1192        Err(invalid_number())
1193    }
1194
1195    fn serialize_u8(self, _v: u8) -> Result<()> {
1196        Err(invalid_number())
1197    }
1198
1199    fn serialize_u16(self, _v: u16) -> Result<()> {
1200        Err(invalid_number())
1201    }
1202
1203    fn serialize_u32(self, _v: u32) -> Result<()> {
1204        Err(invalid_number())
1205    }
1206
1207    fn serialize_u64(self, _v: u64) -> Result<()> {
1208        Err(invalid_number())
1209    }
1210
1211    fn serialize_u128(self, _v: u128) -> Result<()> {
1212        Err(invalid_number())
1213    }
1214
1215    fn serialize_f32(self, _v: f32) -> Result<()> {
1216        Err(invalid_number())
1217    }
1218
1219    fn serialize_f64(self, _v: f64) -> Result<()> {
1220        Err(invalid_number())
1221    }
1222
1223    fn serialize_char(self, _v: char) -> Result<()> {
1224        Err(invalid_number())
1225    }
1226
1227    fn serialize_str(self, value: &str) -> Result<()> {
1228        let NumberStrEmitter(serializer) = self;
1229        serializer
1230            .formatter
1231            .write_number_str(&mut serializer.writer, value)
1232            .map_err(Error::io)
1233    }
1234
1235    fn serialize_bytes(self, _value: &[u8]) -> Result<()> {
1236        Err(invalid_number())
1237    }
1238
1239    fn serialize_none(self) -> Result<()> {
1240        Err(invalid_number())
1241    }
1242
1243    fn serialize_some<T>(self, _value: &T) -> Result<()>
1244    where
1245        T: ?Sized + Serialize,
1246    {
1247        Err(invalid_number())
1248    }
1249
1250    fn serialize_unit(self) -> Result<()> {
1251        Err(invalid_number())
1252    }
1253
1254    fn serialize_unit_struct(self, _name: &'static str) -> Result<()> {
1255        Err(invalid_number())
1256    }
1257
1258    fn serialize_unit_variant(
1259        self,
1260        _name: &'static str,
1261        _variant_index: u32,
1262        _variant: &'static str,
1263    ) -> Result<()> {
1264        Err(invalid_number())
1265    }
1266
1267    fn serialize_newtype_struct<T>(self, _name: &'static str, _value: &T) -> Result<()>
1268    where
1269        T: ?Sized + Serialize,
1270    {
1271        Err(invalid_number())
1272    }
1273
1274    fn serialize_newtype_variant<T>(
1275        self,
1276        _name: &'static str,
1277        _variant_index: u32,
1278        _variant: &'static str,
1279        _value: &T,
1280    ) -> Result<()>
1281    where
1282        T: ?Sized + Serialize,
1283    {
1284        Err(invalid_number())
1285    }
1286
1287    fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq> {
1288        Err(invalid_number())
1289    }
1290
1291    fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple> {
1292        Err(invalid_number())
1293    }
1294
1295    fn serialize_tuple_struct(
1296        self,
1297        _name: &'static str,
1298        _len: usize,
1299    ) -> Result<Self::SerializeTupleStruct> {
1300        Err(invalid_number())
1301    }
1302
1303    fn serialize_tuple_variant(
1304        self,
1305        _name: &'static str,
1306        _variant_index: u32,
1307        _variant: &'static str,
1308        _len: usize,
1309    ) -> Result<Self::SerializeTupleVariant> {
1310        Err(invalid_number())
1311    }
1312
1313    fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap> {
1314        Err(invalid_number())
1315    }
1316
1317    fn serialize_struct(self, _name: &'static str, _len: usize) -> Result<Self::SerializeStruct> {
1318        Err(invalid_number())
1319    }
1320
1321    fn serialize_struct_variant(
1322        self,
1323        _name: &'static str,
1324        _variant_index: u32,
1325        _variant: &'static str,
1326        _len: usize,
1327    ) -> Result<Self::SerializeStructVariant> {
1328        Err(invalid_number())
1329    }
1330}
1331
1332#[cfg(feature = "raw_value")]
1333struct RawValueStrEmitter<'a, W: 'a + io::Write, F: 'a + Formatter>(&'a mut Serializer<W, F>);
1334
1335#[cfg(feature = "raw_value")]
1336impl<'a, W: io::Write, F: Formatter> ser::Serializer for RawValueStrEmitter<'a, W, F> {
1337    type Ok = ();
1338    type Error = Error;
1339
1340    type SerializeSeq = Impossible<(), Error>;
1341    type SerializeTuple = Impossible<(), Error>;
1342    type SerializeTupleStruct = Impossible<(), Error>;
1343    type SerializeTupleVariant = Impossible<(), Error>;
1344    type SerializeMap = Impossible<(), Error>;
1345    type SerializeStruct = Impossible<(), Error>;
1346    type SerializeStructVariant = Impossible<(), Error>;
1347
1348    fn serialize_bool(self, _v: bool) -> Result<()> {
1349        Err(ser::Error::custom("expected RawValue"))
1350    }
1351
1352    fn serialize_i8(self, _v: i8) -> Result<()> {
1353        Err(ser::Error::custom("expected RawValue"))
1354    }
1355
1356    fn serialize_i16(self, _v: i16) -> Result<()> {
1357        Err(ser::Error::custom("expected RawValue"))
1358    }
1359
1360    fn serialize_i32(self, _v: i32) -> Result<()> {
1361        Err(ser::Error::custom("expected RawValue"))
1362    }
1363
1364    fn serialize_i64(self, _v: i64) -> Result<()> {
1365        Err(ser::Error::custom("expected RawValue"))
1366    }
1367
1368    fn serialize_i128(self, _v: i128) -> Result<()> {
1369        Err(ser::Error::custom("expected RawValue"))
1370    }
1371
1372    fn serialize_u8(self, _v: u8) -> Result<()> {
1373        Err(ser::Error::custom("expected RawValue"))
1374    }
1375
1376    fn serialize_u16(self, _v: u16) -> Result<()> {
1377        Err(ser::Error::custom("expected RawValue"))
1378    }
1379
1380    fn serialize_u32(self, _v: u32) -> Result<()> {
1381        Err(ser::Error::custom("expected RawValue"))
1382    }
1383
1384    fn serialize_u64(self, _v: u64) -> Result<()> {
1385        Err(ser::Error::custom("expected RawValue"))
1386    }
1387
1388    fn serialize_u128(self, _v: u128) -> Result<()> {
1389        Err(ser::Error::custom("expected RawValue"))
1390    }
1391
1392    fn serialize_f32(self, _v: f32) -> Result<()> {
1393        Err(ser::Error::custom("expected RawValue"))
1394    }
1395
1396    fn serialize_f64(self, _v: f64) -> Result<()> {
1397        Err(ser::Error::custom("expected RawValue"))
1398    }
1399
1400    fn serialize_char(self, _v: char) -> Result<()> {
1401        Err(ser::Error::custom("expected RawValue"))
1402    }
1403
1404    fn serialize_str(self, value: &str) -> Result<()> {
1405        let RawValueStrEmitter(serializer) = self;
1406        serializer
1407            .formatter
1408            .write_raw_fragment(&mut serializer.writer, value)
1409            .map_err(Error::io)
1410    }
1411
1412    fn serialize_bytes(self, _value: &[u8]) -> Result<()> {
1413        Err(ser::Error::custom("expected RawValue"))
1414    }
1415
1416    fn serialize_none(self) -> Result<()> {
1417        Err(ser::Error::custom("expected RawValue"))
1418    }
1419
1420    fn serialize_some<T>(self, _value: &T) -> Result<()>
1421    where
1422        T: ?Sized + Serialize,
1423    {
1424        Err(ser::Error::custom("expected RawValue"))
1425    }
1426
1427    fn serialize_unit(self) -> Result<()> {
1428        Err(ser::Error::custom("expected RawValue"))
1429    }
1430
1431    fn serialize_unit_struct(self, _name: &'static str) -> Result<()> {
1432        Err(ser::Error::custom("expected RawValue"))
1433    }
1434
1435    fn serialize_unit_variant(
1436        self,
1437        _name: &'static str,
1438        _variant_index: u32,
1439        _variant: &'static str,
1440    ) -> Result<()> {
1441        Err(ser::Error::custom("expected RawValue"))
1442    }
1443
1444    fn serialize_newtype_struct<T>(self, _name: &'static str, _value: &T) -> Result<()>
1445    where
1446        T: ?Sized + Serialize,
1447    {
1448        Err(ser::Error::custom("expected RawValue"))
1449    }
1450
1451    fn serialize_newtype_variant<T>(
1452        self,
1453        _name: &'static str,
1454        _variant_index: u32,
1455        _variant: &'static str,
1456        _value: &T,
1457    ) -> Result<()>
1458    where
1459        T: ?Sized + Serialize,
1460    {
1461        Err(ser::Error::custom("expected RawValue"))
1462    }
1463
1464    fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq> {
1465        Err(ser::Error::custom("expected RawValue"))
1466    }
1467
1468    fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple> {
1469        Err(ser::Error::custom("expected RawValue"))
1470    }
1471
1472    fn serialize_tuple_struct(
1473        self,
1474        _name: &'static str,
1475        _len: usize,
1476    ) -> Result<Self::SerializeTupleStruct> {
1477        Err(ser::Error::custom("expected RawValue"))
1478    }
1479
1480    fn serialize_tuple_variant(
1481        self,
1482        _name: &'static str,
1483        _variant_index: u32,
1484        _variant: &'static str,
1485        _len: usize,
1486    ) -> Result<Self::SerializeTupleVariant> {
1487        Err(ser::Error::custom("expected RawValue"))
1488    }
1489
1490    fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap> {
1491        Err(ser::Error::custom("expected RawValue"))
1492    }
1493
1494    fn serialize_struct(self, _name: &'static str, _len: usize) -> Result<Self::SerializeStruct> {
1495        Err(ser::Error::custom("expected RawValue"))
1496    }
1497
1498    fn serialize_struct_variant(
1499        self,
1500        _name: &'static str,
1501        _variant_index: u32,
1502        _variant: &'static str,
1503        _len: usize,
1504    ) -> Result<Self::SerializeStructVariant> {
1505        Err(ser::Error::custom("expected RawValue"))
1506    }
1507
1508    fn collect_str<T>(self, value: &T) -> Result<Self::Ok>
1509    where
1510        T: ?Sized + Display,
1511    {
1512        self.serialize_str(&value.to_string())
1513    }
1514}
1515
1516pub enum CharEscape {
1518    Quote,
1520    ReverseSolidus,
1522    Solidus,
1524    Backspace,
1526    FormFeed,
1528    LineFeed,
1530    CarriageReturn,
1532    Tab,
1534    AsciiControl(u8),
1537}
1538
1539pub trait Formatter {
1542    #[inline]
1544    fn write_null<W>(&mut self, writer: &mut W) -> io::Result<()>
1545    where
1546        W: ?Sized + io::Write,
1547    {
1548        writer.write_all(b"null")
1549    }
1550
1551    #[inline]
1553    fn write_bool<W>(&mut self, writer: &mut W, value: bool) -> io::Result<()>
1554    where
1555        W: ?Sized + io::Write,
1556    {
1557        let s = if value {
1558            b"true" as &[u8]
1559        } else {
1560            b"false" as &[u8]
1561        };
1562        writer.write_all(s)
1563    }
1564
1565    #[inline]
1567    fn write_i8<W>(&mut self, writer: &mut W, value: i8) -> io::Result<()>
1568    where
1569        W: ?Sized + io::Write,
1570    {
1571        let mut buffer = itoa::Buffer::new();
1572        let s = buffer.format(value);
1573        writer.write_all(s.as_bytes())
1574    }
1575
1576    #[inline]
1578    fn write_i16<W>(&mut self, writer: &mut W, value: i16) -> io::Result<()>
1579    where
1580        W: ?Sized + io::Write,
1581    {
1582        let mut buffer = itoa::Buffer::new();
1583        let s = buffer.format(value);
1584        writer.write_all(s.as_bytes())
1585    }
1586
1587    #[inline]
1589    fn write_i32<W>(&mut self, writer: &mut W, value: i32) -> io::Result<()>
1590    where
1591        W: ?Sized + io::Write,
1592    {
1593        let mut buffer = itoa::Buffer::new();
1594        let s = buffer.format(value);
1595        writer.write_all(s.as_bytes())
1596    }
1597
1598    #[inline]
1600    fn write_i64<W>(&mut self, writer: &mut W, value: i64) -> io::Result<()>
1601    where
1602        W: ?Sized + io::Write,
1603    {
1604        let mut buffer = itoa::Buffer::new();
1605        let s = buffer.format(value);
1606        writer.write_all(s.as_bytes())
1607    }
1608
1609    #[inline]
1611    fn write_i128<W>(&mut self, writer: &mut W, value: i128) -> io::Result<()>
1612    where
1613        W: ?Sized + io::Write,
1614    {
1615        let mut buffer = itoa::Buffer::new();
1616        let s = buffer.format(value);
1617        writer.write_all(s.as_bytes())
1618    }
1619
1620    #[inline]
1622    fn write_u8<W>(&mut self, writer: &mut W, value: u8) -> io::Result<()>
1623    where
1624        W: ?Sized + io::Write,
1625    {
1626        let mut buffer = itoa::Buffer::new();
1627        let s = buffer.format(value);
1628        writer.write_all(s.as_bytes())
1629    }
1630
1631    #[inline]
1633    fn write_u16<W>(&mut self, writer: &mut W, value: u16) -> io::Result<()>
1634    where
1635        W: ?Sized + io::Write,
1636    {
1637        let mut buffer = itoa::Buffer::new();
1638        let s = buffer.format(value);
1639        writer.write_all(s.as_bytes())
1640    }
1641
1642    #[inline]
1644    fn write_u32<W>(&mut self, writer: &mut W, value: u32) -> io::Result<()>
1645    where
1646        W: ?Sized + io::Write,
1647    {
1648        let mut buffer = itoa::Buffer::new();
1649        let s = buffer.format(value);
1650        writer.write_all(s.as_bytes())
1651    }
1652
1653    #[inline]
1655    fn write_u64<W>(&mut self, writer: &mut W, value: u64) -> io::Result<()>
1656    where
1657        W: ?Sized + io::Write,
1658    {
1659        let mut buffer = itoa::Buffer::new();
1660        let s = buffer.format(value);
1661        writer.write_all(s.as_bytes())
1662    }
1663
1664    #[inline]
1666    fn write_u128<W>(&mut self, writer: &mut W, value: u128) -> io::Result<()>
1667    where
1668        W: ?Sized + io::Write,
1669    {
1670        let mut buffer = itoa::Buffer::new();
1671        let s = buffer.format(value);
1672        writer.write_all(s.as_bytes())
1673    }
1674
1675    #[inline]
1691    fn write_f32<W>(&mut self, writer: &mut W, value: f32) -> io::Result<()>
1692    where
1693        W: ?Sized + io::Write,
1694    {
1695        let mut buffer = ryu::Buffer::new();
1696        let s = buffer.format_finite(value);
1697        writer.write_all(s.as_bytes())
1698    }
1699
1700    #[inline]
1716    fn write_f64<W>(&mut self, writer: &mut W, value: f64) -> io::Result<()>
1717    where
1718        W: ?Sized + io::Write,
1719    {
1720        let mut buffer = ryu::Buffer::new();
1721        let s = buffer.format_finite(value);
1722        writer.write_all(s.as_bytes())
1723    }
1724
1725    #[inline]
1727    fn write_number_str<W>(&mut self, writer: &mut W, value: &str) -> io::Result<()>
1728    where
1729        W: ?Sized + io::Write,
1730    {
1731        writer.write_all(value.as_bytes())
1732    }
1733
1734    #[inline]
1737    fn begin_string<W>(&mut self, writer: &mut W) -> io::Result<()>
1738    where
1739        W: ?Sized + io::Write,
1740    {
1741        writer.write_all(b"\"")
1742    }
1743
1744    #[inline]
1747    fn end_string<W>(&mut self, writer: &mut W) -> io::Result<()>
1748    where
1749        W: ?Sized + io::Write,
1750    {
1751        writer.write_all(b"\"")
1752    }
1753
1754    #[inline]
1757    fn write_string_fragment<W>(&mut self, writer: &mut W, fragment: &str) -> io::Result<()>
1758    where
1759        W: ?Sized + io::Write,
1760    {
1761        writer.write_all(fragment.as_bytes())
1762    }
1763
1764    #[inline]
1766    fn write_char_escape<W>(&mut self, writer: &mut W, char_escape: CharEscape) -> io::Result<()>
1767    where
1768        W: ?Sized + io::Write,
1769    {
1770        use self::CharEscape::*;
1771
1772        let escape_char = match char_escape {
1773            Quote => b'"',
1774            ReverseSolidus => b'\\',
1775            Solidus => b'/',
1776            Backspace => b'b',
1777            FormFeed => b'f',
1778            LineFeed => b'n',
1779            CarriageReturn => b'r',
1780            Tab => b't',
1781            AsciiControl(_) => b'u',
1782        };
1783
1784        match char_escape {
1785            AsciiControl(byte) => {
1786                static HEX_DIGITS: [u8; 16] = *b"0123456789abcdef";
1787                let bytes = &[
1788                    b'\\',
1789                    escape_char,
1790                    b'0',
1791                    b'0',
1792                    HEX_DIGITS[(byte >> 4) as usize],
1793                    HEX_DIGITS[(byte & 0xF) as usize],
1794                ];
1795                writer.write_all(bytes)
1796            }
1797            _ => writer.write_all(&[b'\\', escape_char]),
1798        }
1799    }
1800
1801    fn write_byte_array<W>(&mut self, writer: &mut W, value: &[u8]) -> io::Result<()>
1805    where
1806        W: ?Sized + io::Write,
1807    {
1808        tri!(self.begin_array(writer));
1809        let mut first = true;
1810        for byte in value {
1811            tri!(self.begin_array_value(writer, first));
1812            tri!(self.write_u8(writer, *byte));
1813            tri!(self.end_array_value(writer));
1814            first = false;
1815        }
1816        self.end_array(writer)
1817    }
1818
1819    #[inline]
1822    fn begin_array<W>(&mut self, writer: &mut W) -> io::Result<()>
1823    where
1824        W: ?Sized + io::Write,
1825    {
1826        writer.write_all(b"[")
1827    }
1828
1829    #[inline]
1832    fn end_array<W>(&mut self, writer: &mut W) -> io::Result<()>
1833    where
1834        W: ?Sized + io::Write,
1835    {
1836        writer.write_all(b"]")
1837    }
1838
1839    #[inline]
1842    fn begin_array_value<W>(&mut self, writer: &mut W, first: bool) -> io::Result<()>
1843    where
1844        W: ?Sized + io::Write,
1845    {
1846        if first {
1847            Ok(())
1848        } else {
1849            writer.write_all(b",")
1850        }
1851    }
1852
1853    #[inline]
1855    fn end_array_value<W>(&mut self, _writer: &mut W) -> io::Result<()>
1856    where
1857        W: ?Sized + io::Write,
1858    {
1859        Ok(())
1860    }
1861
1862    #[inline]
1865    fn begin_object<W>(&mut self, writer: &mut W) -> io::Result<()>
1866    where
1867        W: ?Sized + io::Write,
1868    {
1869        writer.write_all(b"{")
1870    }
1871
1872    #[inline]
1875    fn end_object<W>(&mut self, writer: &mut W) -> io::Result<()>
1876    where
1877        W: ?Sized + io::Write,
1878    {
1879        writer.write_all(b"}")
1880    }
1881
1882    #[inline]
1884    fn begin_object_key<W>(&mut self, writer: &mut W, first: bool) -> io::Result<()>
1885    where
1886        W: ?Sized + io::Write,
1887    {
1888        if first {
1889            Ok(())
1890        } else {
1891            writer.write_all(b",")
1892        }
1893    }
1894
1895    #[inline]
1899    fn end_object_key<W>(&mut self, _writer: &mut W) -> io::Result<()>
1900    where
1901        W: ?Sized + io::Write,
1902    {
1903        Ok(())
1904    }
1905
1906    #[inline]
1910    fn begin_object_value<W>(&mut self, writer: &mut W) -> io::Result<()>
1911    where
1912        W: ?Sized + io::Write,
1913    {
1914        writer.write_all(b":")
1915    }
1916
1917    #[inline]
1919    fn end_object_value<W>(&mut self, _writer: &mut W) -> io::Result<()>
1920    where
1921        W: ?Sized + io::Write,
1922    {
1923        Ok(())
1924    }
1925
1926    #[inline]
1929    fn write_raw_fragment<W>(&mut self, writer: &mut W, fragment: &str) -> io::Result<()>
1930    where
1931        W: ?Sized + io::Write,
1932    {
1933        writer.write_all(fragment.as_bytes())
1934    }
1935}
1936
1937#[derive(Clone, Debug, Default)]
1939pub struct CompactFormatter;
1940
1941impl Formatter for CompactFormatter {}
1942
1943#[derive(Clone, Debug)]
1945pub struct PrettyFormatter<'a> {
1946    current_indent: usize,
1947    has_value: bool,
1948    indent: &'a [u8],
1949}
1950
1951impl<'a> PrettyFormatter<'a> {
1952    pub fn new() -> Self {
1954        PrettyFormatter::with_indent(b"  ")
1955    }
1956
1957    pub fn with_indent(indent: &'a [u8]) -> Self {
1959        PrettyFormatter {
1960            current_indent: 0,
1961            has_value: false,
1962            indent,
1963        }
1964    }
1965}
1966
1967impl<'a> Default for PrettyFormatter<'a> {
1968    fn default() -> Self {
1969        PrettyFormatter::new()
1970    }
1971}
1972
1973impl<'a> Formatter for PrettyFormatter<'a> {
1974    #[inline]
1975    fn begin_array<W>(&mut self, writer: &mut W) -> io::Result<()>
1976    where
1977        W: ?Sized + io::Write,
1978    {
1979        self.current_indent += 1;
1980        self.has_value = false;
1981        writer.write_all(b"[")
1982    }
1983
1984    #[inline]
1985    fn end_array<W>(&mut self, writer: &mut W) -> io::Result<()>
1986    where
1987        W: ?Sized + io::Write,
1988    {
1989        self.current_indent -= 1;
1990
1991        if self.has_value {
1992            tri!(writer.write_all(b"\n"));
1993            tri!(indent(writer, self.current_indent, self.indent));
1994        }
1995
1996        writer.write_all(b"]")
1997    }
1998
1999    #[inline]
2000    fn begin_array_value<W>(&mut self, writer: &mut W, first: bool) -> io::Result<()>
2001    where
2002        W: ?Sized + io::Write,
2003    {
2004        tri!(writer.write_all(if first { b"\n" } else { b",\n" }));
2005        indent(writer, self.current_indent, self.indent)
2006    }
2007
2008    #[inline]
2009    fn end_array_value<W>(&mut self, _writer: &mut W) -> io::Result<()>
2010    where
2011        W: ?Sized + io::Write,
2012    {
2013        self.has_value = true;
2014        Ok(())
2015    }
2016
2017    #[inline]
2018    fn begin_object<W>(&mut self, writer: &mut W) -> io::Result<()>
2019    where
2020        W: ?Sized + io::Write,
2021    {
2022        self.current_indent += 1;
2023        self.has_value = false;
2024        writer.write_all(b"{")
2025    }
2026
2027    #[inline]
2028    fn end_object<W>(&mut self, writer: &mut W) -> io::Result<()>
2029    where
2030        W: ?Sized + io::Write,
2031    {
2032        self.current_indent -= 1;
2033
2034        if self.has_value {
2035            tri!(writer.write_all(b"\n"));
2036            tri!(indent(writer, self.current_indent, self.indent));
2037        }
2038
2039        writer.write_all(b"}")
2040    }
2041
2042    #[inline]
2043    fn begin_object_key<W>(&mut self, writer: &mut W, first: bool) -> io::Result<()>
2044    where
2045        W: ?Sized + io::Write,
2046    {
2047        tri!(writer.write_all(if first { b"\n" } else { b",\n" }));
2048        indent(writer, self.current_indent, self.indent)
2049    }
2050
2051    #[inline]
2052    fn begin_object_value<W>(&mut self, writer: &mut W) -> io::Result<()>
2053    where
2054        W: ?Sized + io::Write,
2055    {
2056        writer.write_all(b": ")
2057    }
2058
2059    #[inline]
2060    fn end_object_value<W>(&mut self, _writer: &mut W) -> io::Result<()>
2061    where
2062        W: ?Sized + io::Write,
2063    {
2064        self.has_value = true;
2065        Ok(())
2066    }
2067}
2068
2069fn format_escaped_str<W, F>(writer: &mut W, formatter: &mut F, value: &str) -> io::Result<()>
2070where
2071    W: ?Sized + io::Write,
2072    F: ?Sized + Formatter,
2073{
2074    tri!(formatter.begin_string(writer));
2075    tri!(format_escaped_str_contents(writer, formatter, value));
2076    formatter.end_string(writer)
2077}
2078
2079fn format_escaped_str_contents<W, F>(
2080    writer: &mut W,
2081    formatter: &mut F,
2082    value: &str,
2083) -> io::Result<()>
2084where
2085    W: ?Sized + io::Write,
2086    F: ?Sized + Formatter,
2087{
2088    let mut bytes = value.as_bytes();
2089
2090    let mut i = 0;
2091    while i < bytes.len() {
2092        let (string_run, rest) = bytes.split_at(i);
2093        let (&byte, rest) = rest.split_first().unwrap();
2094
2095        let escape = ESCAPE[byte as usize];
2096
2097        i += 1;
2098        if escape == 0 {
2099            continue;
2100        }
2101
2102        bytes = rest;
2103        i = 0;
2104
2105        let string_run = unsafe { str::from_utf8_unchecked(string_run) };
2107        if !string_run.is_empty() {
2108            tri!(formatter.write_string_fragment(writer, string_run));
2109        }
2110
2111        let char_escape = match escape {
2112            self::BB => CharEscape::Backspace,
2113            self::TT => CharEscape::Tab,
2114            self::NN => CharEscape::LineFeed,
2115            self::FF => CharEscape::FormFeed,
2116            self::RR => CharEscape::CarriageReturn,
2117            self::QU => CharEscape::Quote,
2118            self::BS => CharEscape::ReverseSolidus,
2119            self::UU => CharEscape::AsciiControl(byte),
2120            _ => unsafe { hint::unreachable_unchecked() },
2122        };
2123        tri!(formatter.write_char_escape(writer, char_escape));
2124    }
2125
2126    let string_run = unsafe { str::from_utf8_unchecked(bytes) };
2128    if string_run.is_empty() {
2129        return Ok(());
2130    }
2131
2132    formatter.write_string_fragment(writer, string_run)
2133}
2134
2135const BB: u8 = b'b'; const TT: u8 = b't'; const NN: u8 = b'n'; const FF: u8 = b'f'; const RR: u8 = b'r'; const QU: u8 = b'"'; const BS: u8 = b'\\'; const UU: u8 = b'u'; const __: u8 = 0;
2144
2145static ESCAPE: [u8; 256] = [
2148    UU, UU, UU, UU, UU, UU, UU, UU, BB, TT, NN, UU, FF, RR, UU, UU, UU, UU, UU, UU, UU, UU, UU, UU, UU, UU, UU, UU, UU, UU, UU, UU, __, __, QU, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, BS, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, ];
2166
2167#[inline]
2176#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
2177pub fn to_writer<W, T>(writer: W, value: &T) -> Result<()>
2178where
2179    W: io::Write,
2180    T: ?Sized + Serialize,
2181{
2182    let mut ser = Serializer::new(writer);
2183    value.serialize(&mut ser)
2184}
2185
2186#[inline]
2196#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
2197pub fn to_writer_pretty<W, T>(writer: W, value: &T) -> Result<()>
2198where
2199    W: io::Write,
2200    T: ?Sized + Serialize,
2201{
2202    let mut ser = Serializer::pretty(writer);
2203    value.serialize(&mut ser)
2204}
2205
2206#[inline]
2213pub fn to_vec<T>(value: &T) -> Result<Vec<u8>>
2214where
2215    T: ?Sized + Serialize,
2216{
2217    let mut writer = Vec::with_capacity(128);
2218    tri!(to_writer(&mut writer, value));
2219    Ok(writer)
2220}
2221
2222#[inline]
2229pub fn to_vec_pretty<T>(value: &T) -> Result<Vec<u8>>
2230where
2231    T: ?Sized + Serialize,
2232{
2233    let mut writer = Vec::with_capacity(128);
2234    tri!(to_writer_pretty(&mut writer, value));
2235    Ok(writer)
2236}
2237
2238#[inline]
2245pub fn to_string<T>(value: &T) -> Result<String>
2246where
2247    T: ?Sized + Serialize,
2248{
2249    let vec = tri!(to_vec(value));
2250    let string = unsafe {
2251        String::from_utf8_unchecked(vec)
2253    };
2254    Ok(string)
2255}
2256
2257#[inline]
2264pub fn to_string_pretty<T>(value: &T) -> Result<String>
2265where
2266    T: ?Sized + Serialize,
2267{
2268    let vec = tri!(to_vec_pretty(value));
2269    let string = unsafe {
2270        String::from_utf8_unchecked(vec)
2272    };
2273    Ok(string)
2274}
2275
2276fn indent<W>(wr: &mut W, n: usize, s: &[u8]) -> io::Result<()>
2277where
2278    W: ?Sized + io::Write,
2279{
2280    for _ in 0..n {
2281        tri!(wr.write_all(s));
2282    }
2283
2284    Ok(())
2285}