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