1 //! Serialize a Rust data structure into JSON data.
3 use crate::error
::{Error, ErrorCode, Result}
;
5 use crate::lib
::num
::FpCategory
;
7 use serde
::ser
::{self, Impossible, Serialize}
;
8 use serde
::serde_if_integer128
;
10 /// A structure for serializing Rust values into JSON.
11 pub struct Serializer
<W
, F
= CompactFormatter
> {
20 /// Creates a new JSON serializer.
22 pub fn new(writer
: W
) -> Self {
23 Serializer
::with_formatter(writer
, CompactFormatter
)
27 impl<'a
, W
> Serializer
<W
, PrettyFormatter
<'a
>>
31 /// Creates a new JSON pretty print serializer.
33 pub fn pretty(writer
: W
) -> Self {
34 Serializer
::with_formatter(writer
, PrettyFormatter
::new())
38 impl<W
, F
> Serializer
<W
, F
>
43 /// Creates a new JSON visitor whose output will be written to the writer
46 pub fn with_formatter(writer
: W
, formatter
: F
) -> Self {
47 Serializer { writer, formatter }
50 /// Unwrap the `Writer` from the `Serializer`.
52 pub fn into_inner(self) -> W
{
57 impl<'a
, W
, F
> ser
::Serializer
for &'a
mut Serializer
<W
, F
>
65 type SerializeSeq
= Compound
<'a
, W
, F
>;
66 type SerializeTuple
= Compound
<'a
, W
, F
>;
67 type SerializeTupleStruct
= Compound
<'a
, W
, F
>;
68 type SerializeTupleVariant
= Compound
<'a
, W
, F
>;
69 type SerializeMap
= Compound
<'a
, W
, F
>;
70 type SerializeStruct
= Compound
<'a
, W
, F
>;
71 type SerializeStructVariant
= Compound
<'a
, W
, F
>;
74 fn serialize_bool(self, value
: bool
) -> Result
<()> {
77 .write_bool(&mut self.writer
, value
)
83 fn serialize_i8(self, value
: i8) -> Result
<()> {
86 .write_i8(&mut self.writer
, value
)
92 fn serialize_i16(self, value
: i16) -> Result
<()> {
95 .write_i16(&mut self.writer
, value
)
101 fn serialize_i32(self, value
: i32) -> Result
<()> {
104 .write_i32(&mut self.writer
, value
)
105 .map_err(Error
::io
));
110 fn serialize_i64(self, value
: i64) -> Result
<()> {
113 .write_i64(&mut self.writer
, value
)
114 .map_err(Error
::io
));
118 serde_if_integer128
! {
119 fn serialize_i128(self, value
: i128
) -> Result
<()> {
121 .write_number_str(&mut self.writer
, &value
.to_string())
127 fn serialize_u8(self, value
: u8) -> Result
<()> {
130 .write_u8(&mut self.writer
, value
)
131 .map_err(Error
::io
));
136 fn serialize_u16(self, value
: u16) -> Result
<()> {
139 .write_u16(&mut self.writer
, value
)
140 .map_err(Error
::io
));
145 fn serialize_u32(self, value
: u32) -> Result
<()> {
148 .write_u32(&mut self.writer
, value
)
149 .map_err(Error
::io
));
154 fn serialize_u64(self, value
: u64) -> Result
<()> {
157 .write_u64(&mut self.writer
, value
)
158 .map_err(Error
::io
));
162 serde_if_integer128
! {
163 fn serialize_u128(self, value
: u128
) -> Result
<()> {
165 .write_number_str(&mut self.writer
, &value
.to_string())
171 fn serialize_f32(self, value
: f32) -> Result
<()> {
172 match value
.classify() {
173 FpCategory
::Nan
| FpCategory
::Infinite
=> {
176 .write_null(&mut self.writer
)
177 .map_err(Error
::io
));
182 .write_f32(&mut self.writer
, value
)
183 .map_err(Error
::io
));
190 fn serialize_f64(self, value
: f64) -> Result
<()> {
191 match value
.classify() {
192 FpCategory
::Nan
| FpCategory
::Infinite
=> {
195 .write_null(&mut self.writer
)
196 .map_err(Error
::io
));
201 .write_f64(&mut self.writer
, value
)
202 .map_err(Error
::io
));
209 fn serialize_char(self, value
: char) -> Result
<()> {
210 // A char encoded as UTF-8 takes 4 bytes at most.
211 let mut buf
= [0; 4];
212 self.serialize_str(value
.encode_utf8(&mut buf
))
216 fn serialize_str(self, value
: &str) -> Result
<()> {
217 tri
!(format_escaped_str(&mut self.writer
, &mut self.formatter
, value
).map_err(Error
::io
));
222 fn serialize_bytes(self, value
: &[u8]) -> Result
<()> {
223 use serde
::ser
::SerializeSeq
;
224 let mut seq
= tri
!(self.serialize_seq(Some(value
.len())));
226 tri
!(seq
.serialize_element(byte
));
232 fn serialize_unit(self) -> Result
<()> {
235 .write_null(&mut self.writer
)
236 .map_err(Error
::io
));
241 fn serialize_unit_struct(self, _name
: &'
static str) -> Result
<()> {
242 self.serialize_unit()
246 fn serialize_unit_variant(
250 variant
: &'
static str,
252 self.serialize_str(variant
)
255 /// Serialize newtypes without an object wrapper.
257 fn serialize_newtype_struct
<T
>(self, _name
: &'
static str, value
: &T
) -> Result
<()>
259 T
: ?Sized
+ Serialize
,
261 value
.serialize(self)
265 fn serialize_newtype_variant
<T
>(
269 variant
: &'
static str,
273 T
: ?Sized
+ Serialize
,
277 .begin_object(&mut self.writer
)
278 .map_err(Error
::io
));
281 .begin_object_key(&mut self.writer
, true)
282 .map_err(Error
::io
));
283 tri
!(self.serialize_str(variant
));
286 .end_object_key(&mut self.writer
)
287 .map_err(Error
::io
));
290 .begin_object_value(&mut self.writer
)
291 .map_err(Error
::io
));
292 tri
!(value
.serialize(&mut *self));
295 .end_object_value(&mut self.writer
)
296 .map_err(Error
::io
));
299 .end_object(&mut self.writer
)
300 .map_err(Error
::io
));
305 fn serialize_none(self) -> Result
<()> {
306 self.serialize_unit()
310 fn serialize_some
<T
>(self, value
: &T
) -> Result
<()>
312 T
: ?Sized
+ Serialize
,
314 value
.serialize(self)
318 fn serialize_seq(self, len
: Option
<usize>) -> Result
<Self::SerializeSeq
> {
322 .begin_array(&mut self.writer
)
323 .map_err(Error
::io
));
326 .end_array(&mut self.writer
)
327 .map_err(Error
::io
));
335 .begin_array(&mut self.writer
)
336 .map_err(Error
::io
));
345 fn serialize_tuple(self, len
: usize) -> Result
<Self::SerializeTuple
> {
346 self.serialize_seq(Some(len
))
350 fn serialize_tuple_struct(
354 ) -> Result
<Self::SerializeTupleStruct
> {
355 self.serialize_seq(Some(len
))
359 fn serialize_tuple_variant(
363 variant
: &'
static str,
365 ) -> Result
<Self::SerializeTupleVariant
> {
368 .begin_object(&mut self.writer
)
369 .map_err(Error
::io
));
372 .begin_object_key(&mut self.writer
, true)
373 .map_err(Error
::io
));
374 tri
!(self.serialize_str(variant
));
377 .end_object_key(&mut self.writer
)
378 .map_err(Error
::io
));
381 .begin_object_value(&mut self.writer
)
382 .map_err(Error
::io
));
383 self.serialize_seq(Some(len
))
387 fn serialize_map(self, len
: Option
<usize>) -> Result
<Self::SerializeMap
> {
391 .begin_object(&mut self.writer
)
392 .map_err(Error
::io
));
395 .end_object(&mut self.writer
)
396 .map_err(Error
::io
));
404 .begin_object(&mut self.writer
)
405 .map_err(Error
::io
));
414 fn serialize_struct(self, name
: &'
static str, len
: usize) -> Result
<Self::SerializeStruct
> {
416 #[cfg(feature = "arbitrary_precision")]
417 crate::number
::TOKEN
=> Ok(Compound
::Number { ser: self }
),
418 #[cfg(feature = "raw_value")]
419 crate::raw
::TOKEN
=> Ok(Compound
::RawValue { ser: self }
),
420 _
=> self.serialize_map(Some(len
)),
425 fn serialize_struct_variant(
429 variant
: &'
static str,
431 ) -> Result
<Self::SerializeStructVariant
> {
434 .begin_object(&mut self.writer
)
435 .map_err(Error
::io
));
438 .begin_object_key(&mut self.writer
, true)
439 .map_err(Error
::io
));
440 tri
!(self.serialize_str(variant
));
443 .end_object_key(&mut self.writer
)
444 .map_err(Error
::io
));
447 .begin_object_value(&mut self.writer
)
448 .map_err(Error
::io
));
449 self.serialize_map(Some(len
))
452 fn collect_str
<T
>(self, value
: &T
) -> Result
<()>
456 use self::fmt
::Write
;
458 struct Adapter
<'ser
, W
: 'ser
, F
: 'ser
> {
460 formatter
: &'ser
mut F
,
461 error
: Option
<io
::Error
>,
464 impl<'ser
, W
, F
> Write
for Adapter
<'ser
, W
, F
>
469 fn write_str(&mut self, s
: &str) -> fmt
::Result
{
470 debug_assert
!(self.error
.is_none());
471 match format_escaped_str_contents(self.writer
, self.formatter
, s
) {
474 self.error
= Some(err
);
483 .begin_string(&mut self.writer
)
484 .map_err(Error
::io
));
486 let mut adapter
= Adapter
{
487 writer
: &mut self.writer
,
488 formatter
: &mut self.formatter
,
491 match write
!(adapter
, "{}", value
) {
492 Ok(()) => debug_assert
!(adapter
.error
.is_none()),
494 return Err(Error
::io(adapter
.error
.expect("there should be an error")));
500 .end_string(&mut self.writer
)
501 .map_err(Error
::io
));
506 // Not public API. Should be pub(crate).
508 #[derive(Eq, PartialEq)]
515 // Not public API. Should be pub(crate).
517 pub enum Compound
<'a
, W
: 'a
, F
: 'a
> {
519 ser
: &'a
mut Serializer
<W
, F
>,
522 #[cfg(feature = "arbitrary_precision")]
523 Number { ser: &'a mut Serializer<W, F> }
,
524 #[cfg(feature = "raw_value")]
525 RawValue { ser: &'a mut Serializer<W, F> }
,
528 impl<'a
, W
, F
> ser
::SerializeSeq
for Compound
<'a
, W
, F
>
537 fn serialize_element
<T
>(&mut self, value
: &T
) -> Result
<()>
539 T
: ?Sized
+ Serialize
,
548 .begin_array_value(&mut ser
.writer
, *state
== State
::First
)
549 .map_err(Error
::io
));
550 *state
= State
::Rest
;
551 tri
!(value
.serialize(&mut **ser
));
554 .end_array_value(&mut ser
.writer
)
555 .map_err(Error
::io
));
558 #[cfg(feature = "arbitrary_precision")]
559 Compound
::Number { .. }
=> unreachable
!(),
560 #[cfg(feature = "raw_value")]
561 Compound
::RawValue { .. }
=> unreachable
!(),
566 fn end(self) -> Result
<()> {
568 Compound
::Map { ser, state }
=> {
571 _
=> tri
!(ser
.formatter
.end_array(&mut ser
.writer
).map_err(Error
::io
)),
575 #[cfg(feature = "arbitrary_precision")]
576 Compound
::Number { .. }
=> unreachable
!(),
577 #[cfg(feature = "raw_value")]
578 Compound
::RawValue { .. }
=> unreachable
!(),
583 impl<'a
, W
, F
> ser
::SerializeTuple
for Compound
<'a
, W
, F
>
592 fn serialize_element
<T
>(&mut self, value
: &T
) -> Result
<()>
594 T
: ?Sized
+ Serialize
,
596 ser
::SerializeSeq
::serialize_element(self, value
)
600 fn end(self) -> Result
<()> {
601 ser
::SerializeSeq
::end(self)
605 impl<'a
, W
, F
> ser
::SerializeTupleStruct
for Compound
<'a
, W
, F
>
614 fn serialize_field
<T
>(&mut self, value
: &T
) -> Result
<()>
616 T
: ?Sized
+ Serialize
,
618 ser
::SerializeSeq
::serialize_element(self, value
)
622 fn end(self) -> Result
<()> {
623 ser
::SerializeSeq
::end(self)
627 impl<'a
, W
, F
> ser
::SerializeTupleVariant
for Compound
<'a
, W
, F
>
636 fn serialize_field
<T
>(&mut self, value
: &T
) -> Result
<()>
638 T
: ?Sized
+ Serialize
,
640 ser
::SerializeSeq
::serialize_element(self, value
)
644 fn end(self) -> Result
<()> {
646 Compound
::Map { ser, state }
=> {
649 _
=> tri
!(ser
.formatter
.end_array(&mut ser
.writer
).map_err(Error
::io
)),
653 .end_object_value(&mut ser
.writer
)
654 .map_err(Error
::io
));
655 tri
!(ser
.formatter
.end_object(&mut ser
.writer
).map_err(Error
::io
));
658 #[cfg(feature = "arbitrary_precision")]
659 Compound
::Number { .. }
=> unreachable
!(),
660 #[cfg(feature = "raw_value")]
661 Compound
::RawValue { .. }
=> unreachable
!(),
666 impl<'a
, W
, F
> ser
::SerializeMap
for Compound
<'a
, W
, F
>
675 fn serialize_key
<T
>(&mut self, key
: &T
) -> Result
<()>
677 T
: ?Sized
+ Serialize
,
686 .begin_object_key(&mut ser
.writer
, *state
== State
::First
)
687 .map_err(Error
::io
));
688 *state
= State
::Rest
;
690 tri
!(key
.serialize(MapKeySerializer { ser: *ser }
));
694 .end_object_key(&mut ser
.writer
)
695 .map_err(Error
::io
));
698 #[cfg(feature = "arbitrary_precision")]
699 Compound
::Number { .. }
=> unreachable
!(),
700 #[cfg(feature = "raw_value")]
701 Compound
::RawValue { .. }
=> unreachable
!(),
706 fn serialize_value
<T
>(&mut self, value
: &T
) -> Result
<()>
708 T
: ?Sized
+ Serialize
,
711 Compound
::Map { ref mut ser, .. }
=> {
714 .begin_object_value(&mut ser
.writer
)
715 .map_err(Error
::io
));
716 tri
!(value
.serialize(&mut **ser
));
719 .end_object_value(&mut ser
.writer
)
720 .map_err(Error
::io
));
723 #[cfg(feature = "arbitrary_precision")]
724 Compound
::Number { .. }
=> unreachable
!(),
725 #[cfg(feature = "raw_value")]
726 Compound
::RawValue { .. }
=> unreachable
!(),
731 fn end(self) -> Result
<()> {
733 Compound
::Map { ser, state }
=> {
736 _
=> tri
!(ser
.formatter
.end_object(&mut ser
.writer
).map_err(Error
::io
)),
740 #[cfg(feature = "arbitrary_precision")]
741 Compound
::Number { .. }
=> unreachable
!(),
742 #[cfg(feature = "raw_value")]
743 Compound
::RawValue { .. }
=> unreachable
!(),
748 impl<'a
, W
, F
> ser
::SerializeStruct
for Compound
<'a
, W
, F
>
757 fn serialize_field
<T
>(&mut self, key
: &'
static str, value
: &T
) -> Result
<()>
759 T
: ?Sized
+ Serialize
,
762 Compound
::Map { .. }
=> ser
::SerializeMap
::serialize_entry(self, key
, value
),
763 #[cfg(feature = "arbitrary_precision")]
764 Compound
::Number { ref mut ser, .. }
=> {
765 if key
== crate::number
::TOKEN
{
766 tri
!(value
.serialize(NumberStrEmitter(&mut *ser
)));
769 Err(invalid_number())
772 #[cfg(feature = "raw_value")]
773 Compound
::RawValue { ref mut ser, .. }
=> {
774 if key
== crate::raw
::TOKEN
{
775 tri
!(value
.serialize(RawValueStrEmitter(&mut *ser
)));
778 Err(invalid_raw_value())
785 fn end(self) -> Result
<()> {
787 Compound
::Map { .. }
=> ser
::SerializeMap
::end(self),
788 #[cfg(feature = "arbitrary_precision")]
789 Compound
::Number { .. }
=> Ok(()),
790 #[cfg(feature = "raw_value")]
791 Compound
::RawValue { .. }
=> Ok(()),
796 impl<'a
, W
, F
> ser
::SerializeStructVariant
for Compound
<'a
, W
, F
>
805 fn serialize_field
<T
>(&mut self, key
: &'
static str, value
: &T
) -> Result
<()>
807 T
: ?Sized
+ Serialize
,
810 Compound
::Map { .. }
=> ser
::SerializeStruct
::serialize_field(self, key
, value
),
811 #[cfg(feature = "arbitrary_precision")]
812 Compound
::Number { .. }
=> unreachable
!(),
813 #[cfg(feature = "raw_value")]
814 Compound
::RawValue { .. }
=> unreachable
!(),
819 fn end(self) -> Result
<()> {
821 Compound
::Map { ser, state }
=> {
824 _
=> tri
!(ser
.formatter
.end_object(&mut ser
.writer
).map_err(Error
::io
)),
828 .end_object_value(&mut ser
.writer
)
829 .map_err(Error
::io
));
830 tri
!(ser
.formatter
.end_object(&mut ser
.writer
).map_err(Error
::io
));
833 #[cfg(feature = "arbitrary_precision")]
834 Compound
::Number { .. }
=> unreachable
!(),
835 #[cfg(feature = "raw_value")]
836 Compound
::RawValue { .. }
=> unreachable
!(),
841 struct MapKeySerializer
<'a
, W
: 'a
, F
: 'a
> {
842 ser
: &'a
mut Serializer
<W
, F
>,
845 #[cfg(feature = "arbitrary_precision")]
846 fn invalid_number() -> Error
{
847 Error
::syntax(ErrorCode
::InvalidNumber
, 0, 0)
850 #[cfg(feature = "raw_value")]
851 fn invalid_raw_value() -> Error
{
852 Error
::syntax(ErrorCode
::ExpectedSomeValue
, 0, 0)
855 fn key_must_be_a_string() -> Error
{
856 Error
::syntax(ErrorCode
::KeyMustBeAString
, 0, 0)
859 impl<'a
, W
, F
> ser
::Serializer
for MapKeySerializer
<'a
, W
, F
>
868 fn serialize_str(self, value
: &str) -> Result
<()> {
869 self.ser
.serialize_str(value
)
873 fn serialize_unit_variant(
877 variant
: &'
static str,
879 self.ser
.serialize_str(variant
)
883 fn serialize_newtype_struct
<T
>(self, _name
: &'
static str, value
: &T
) -> Result
<()>
885 T
: ?Sized
+ Serialize
,
887 value
.serialize(self)
890 type SerializeSeq
= Impossible
<(), Error
>;
891 type SerializeTuple
= Impossible
<(), Error
>;
892 type SerializeTupleStruct
= Impossible
<(), Error
>;
893 type SerializeTupleVariant
= Impossible
<(), Error
>;
894 type SerializeMap
= Impossible
<(), Error
>;
895 type SerializeStruct
= Impossible
<(), Error
>;
896 type SerializeStructVariant
= Impossible
<(), Error
>;
898 fn serialize_bool(self, _value
: bool
) -> Result
<()> {
899 Err(key_must_be_a_string())
902 fn serialize_i8(self, value
: i8) -> Result
<()> {
906 .begin_string(&mut self.ser
.writer
)
907 .map_err(Error
::io
));
911 .write_i8(&mut self.ser
.writer
, value
)
912 .map_err(Error
::io
));
916 .end_string(&mut self.ser
.writer
)
917 .map_err(Error
::io
));
921 fn serialize_i16(self, value
: i16) -> Result
<()> {
925 .begin_string(&mut self.ser
.writer
)
926 .map_err(Error
::io
));
930 .write_i16(&mut self.ser
.writer
, value
)
931 .map_err(Error
::io
));
935 .end_string(&mut self.ser
.writer
)
936 .map_err(Error
::io
));
940 fn serialize_i32(self, value
: i32) -> Result
<()> {
944 .begin_string(&mut self.ser
.writer
)
945 .map_err(Error
::io
));
949 .write_i32(&mut self.ser
.writer
, value
)
950 .map_err(Error
::io
));
954 .end_string(&mut self.ser
.writer
)
955 .map_err(Error
::io
));
959 fn serialize_i64(self, value
: i64) -> Result
<()> {
963 .begin_string(&mut self.ser
.writer
)
964 .map_err(Error
::io
));
968 .write_i64(&mut self.ser
.writer
, value
)
969 .map_err(Error
::io
));
973 .end_string(&mut self.ser
.writer
)
974 .map_err(Error
::io
));
978 serde_if_integer128
! {
979 fn serialize_i128(self, value
: i128
) -> Result
<()> {
983 .begin_string(&mut self.ser
.writer
)
984 .map_err(Error
::io
));
988 .write_number_str(&mut self.ser
.writer
, &value
.to_string())
989 .map_err(Error
::io
));
993 .end_string(&mut self.ser
.writer
)
994 .map_err(Error
::io
));
999 fn serialize_u8(self, value
: u8) -> Result
<()> {
1003 .begin_string(&mut self.ser
.writer
)
1004 .map_err(Error
::io
));
1008 .write_u8(&mut self.ser
.writer
, value
)
1009 .map_err(Error
::io
));
1013 .end_string(&mut self.ser
.writer
)
1014 .map_err(Error
::io
));
1018 fn serialize_u16(self, value
: u16) -> Result
<()> {
1022 .begin_string(&mut self.ser
.writer
)
1023 .map_err(Error
::io
));
1027 .write_u16(&mut self.ser
.writer
, value
)
1028 .map_err(Error
::io
));
1032 .end_string(&mut self.ser
.writer
)
1033 .map_err(Error
::io
));
1037 fn serialize_u32(self, value
: u32) -> Result
<()> {
1041 .begin_string(&mut self.ser
.writer
)
1042 .map_err(Error
::io
));
1046 .write_u32(&mut self.ser
.writer
, value
)
1047 .map_err(Error
::io
));
1051 .end_string(&mut self.ser
.writer
)
1052 .map_err(Error
::io
));
1056 fn serialize_u64(self, value
: u64) -> Result
<()> {
1060 .begin_string(&mut self.ser
.writer
)
1061 .map_err(Error
::io
));
1065 .write_u64(&mut self.ser
.writer
, value
)
1066 .map_err(Error
::io
));
1070 .end_string(&mut self.ser
.writer
)
1071 .map_err(Error
::io
));
1075 serde_if_integer128
! {
1076 fn serialize_u128(self, value
: u128
) -> Result
<()> {
1080 .begin_string(&mut self.ser
.writer
)
1081 .map_err(Error
::io
));
1085 .write_number_str(&mut self.ser
.writer
, &value
.to_string())
1086 .map_err(Error
::io
));
1090 .end_string(&mut self.ser
.writer
)
1091 .map_err(Error
::io
));
1096 fn serialize_f32(self, _value
: f32) -> Result
<()> {
1097 Err(key_must_be_a_string())
1100 fn serialize_f64(self, _value
: f64) -> Result
<()> {
1101 Err(key_must_be_a_string())
1104 fn serialize_char(self, value
: char) -> Result
<()> {
1105 self.ser
.serialize_str(&value
.to_string())
1108 fn serialize_bytes(self, _value
: &[u8]) -> Result
<()> {
1109 Err(key_must_be_a_string())
1112 fn serialize_unit(self) -> Result
<()> {
1113 Err(key_must_be_a_string())
1116 fn serialize_unit_struct(self, _name
: &'
static str) -> Result
<()> {
1117 Err(key_must_be_a_string())
1120 fn serialize_newtype_variant
<T
>(
1122 _name
: &'
static str,
1123 _variant_index
: u32,
1124 _variant
: &'
static str,
1128 T
: ?Sized
+ Serialize
,
1130 Err(key_must_be_a_string())
1133 fn serialize_none(self) -> Result
<()> {
1134 Err(key_must_be_a_string())
1137 fn serialize_some
<T
>(self, _value
: &T
) -> Result
<()>
1139 T
: ?Sized
+ Serialize
,
1141 Err(key_must_be_a_string())
1144 fn serialize_seq(self, _len
: Option
<usize>) -> Result
<Self::SerializeSeq
> {
1145 Err(key_must_be_a_string())
1148 fn serialize_tuple(self, _len
: usize) -> Result
<Self::SerializeTuple
> {
1149 Err(key_must_be_a_string())
1152 fn serialize_tuple_struct(
1154 _name
: &'
static str,
1156 ) -> Result
<Self::SerializeTupleStruct
> {
1157 Err(key_must_be_a_string())
1160 fn serialize_tuple_variant(
1162 _name
: &'
static str,
1163 _variant_index
: u32,
1164 _variant
: &'
static str,
1166 ) -> Result
<Self::SerializeTupleVariant
> {
1167 Err(key_must_be_a_string())
1170 fn serialize_map(self, _len
: Option
<usize>) -> Result
<Self::SerializeMap
> {
1171 Err(key_must_be_a_string())
1174 fn serialize_struct(self, _name
: &'
static str, _len
: usize) -> Result
<Self::SerializeStruct
> {
1175 Err(key_must_be_a_string())
1178 fn serialize_struct_variant(
1180 _name
: &'
static str,
1181 _variant_index
: u32,
1182 _variant
: &'
static str,
1184 ) -> Result
<Self::SerializeStructVariant
> {
1185 Err(key_must_be_a_string())
1188 fn collect_str
<T
>(self, value
: &T
) -> Result
<()>
1190 T
: ?Sized
+ Display
,
1192 self.ser
.collect_str(value
)
1196 #[cfg(feature = "arbitrary_precision")]
1197 struct NumberStrEmitter
<'a
, W
: 'a
+ io
::Write
, F
: 'a
+ Formatter
>(&'a
mut Serializer
<W
, F
>);
1199 #[cfg(feature = "arbitrary_precision")]
1200 impl<'a
, W
: io
::Write
, F
: Formatter
> ser
::Serializer
for NumberStrEmitter
<'a
, W
, F
> {
1204 type SerializeSeq
= Impossible
<(), Error
>;
1205 type SerializeTuple
= Impossible
<(), Error
>;
1206 type SerializeTupleStruct
= Impossible
<(), Error
>;
1207 type SerializeTupleVariant
= Impossible
<(), Error
>;
1208 type SerializeMap
= Impossible
<(), Error
>;
1209 type SerializeStruct
= Impossible
<(), Error
>;
1210 type SerializeStructVariant
= Impossible
<(), Error
>;
1212 fn serialize_bool(self, _v
: bool
) -> Result
<()> {
1213 Err(invalid_number())
1216 fn serialize_i8(self, _v
: i8) -> Result
<()> {
1217 Err(invalid_number())
1220 fn serialize_i16(self, _v
: i16) -> Result
<()> {
1221 Err(invalid_number())
1224 fn serialize_i32(self, _v
: i32) -> Result
<()> {
1225 Err(invalid_number())
1228 fn serialize_i64(self, _v
: i64) -> Result
<()> {
1229 Err(invalid_number())
1232 serde_if_integer128
! {
1233 fn serialize_i128(self, _v
: i128
) -> Result
<()> {
1234 Err(invalid_number())
1238 fn serialize_u8(self, _v
: u8) -> Result
<()> {
1239 Err(invalid_number())
1242 fn serialize_u16(self, _v
: u16) -> Result
<()> {
1243 Err(invalid_number())
1246 fn serialize_u32(self, _v
: u32) -> Result
<()> {
1247 Err(invalid_number())
1250 fn serialize_u64(self, _v
: u64) -> Result
<()> {
1251 Err(invalid_number())
1254 serde_if_integer128
! {
1255 fn serialize_u128(self, _v
: u128
) -> Result
<()> {
1256 Err(invalid_number())
1260 fn serialize_f32(self, _v
: f32) -> Result
<()> {
1261 Err(invalid_number())
1264 fn serialize_f64(self, _v
: f64) -> Result
<()> {
1265 Err(invalid_number())
1268 fn serialize_char(self, _v
: char) -> Result
<()> {
1269 Err(invalid_number())
1272 fn serialize_str(self, value
: &str) -> Result
<()> {
1273 let NumberStrEmitter(serializer
) = self;
1276 .write_number_str(&mut serializer
.writer
, value
)
1280 fn serialize_bytes(self, _value
: &[u8]) -> Result
<()> {
1281 Err(invalid_number())
1284 fn serialize_none(self) -> Result
<()> {
1285 Err(invalid_number())
1288 fn serialize_some
<T
>(self, _value
: &T
) -> Result
<()>
1290 T
: ?Sized
+ Serialize
,
1292 Err(invalid_number())
1295 fn serialize_unit(self) -> Result
<()> {
1296 Err(invalid_number())
1299 fn serialize_unit_struct(self, _name
: &'
static str) -> Result
<()> {
1300 Err(invalid_number())
1303 fn serialize_unit_variant(
1305 _name
: &'
static str,
1306 _variant_index
: u32,
1307 _variant
: &'
static str,
1309 Err(invalid_number())
1312 fn serialize_newtype_struct
<T
>(self, _name
: &'
static str, _value
: &T
) -> Result
<()>
1314 T
: ?Sized
+ Serialize
,
1316 Err(invalid_number())
1319 fn serialize_newtype_variant
<T
>(
1321 _name
: &'
static str,
1322 _variant_index
: u32,
1323 _variant
: &'
static str,
1327 T
: ?Sized
+ Serialize
,
1329 Err(invalid_number())
1332 fn serialize_seq(self, _len
: Option
<usize>) -> Result
<Self::SerializeSeq
> {
1333 Err(invalid_number())
1336 fn serialize_tuple(self, _len
: usize) -> Result
<Self::SerializeTuple
> {
1337 Err(invalid_number())
1340 fn serialize_tuple_struct(
1342 _name
: &'
static str,
1344 ) -> Result
<Self::SerializeTupleStruct
> {
1345 Err(invalid_number())
1348 fn serialize_tuple_variant(
1350 _name
: &'
static str,
1351 _variant_index
: u32,
1352 _variant
: &'
static str,
1354 ) -> Result
<Self::SerializeTupleVariant
> {
1355 Err(invalid_number())
1358 fn serialize_map(self, _len
: Option
<usize>) -> Result
<Self::SerializeMap
> {
1359 Err(invalid_number())
1362 fn serialize_struct(self, _name
: &'
static str, _len
: usize) -> Result
<Self::SerializeStruct
> {
1363 Err(invalid_number())
1366 fn serialize_struct_variant(
1368 _name
: &'
static str,
1369 _variant_index
: u32,
1370 _variant
: &'
static str,
1372 ) -> Result
<Self::SerializeStructVariant
> {
1373 Err(invalid_number())
1377 #[cfg(feature = "raw_value")]
1378 struct RawValueStrEmitter
<'a
, W
: 'a
+ io
::Write
, F
: 'a
+ Formatter
>(&'a
mut Serializer
<W
, F
>);
1380 #[cfg(feature = "raw_value")]
1381 impl<'a
, W
: io
::Write
, F
: Formatter
> ser
::Serializer
for RawValueStrEmitter
<'a
, W
, F
> {
1385 type SerializeSeq
= Impossible
<(), Error
>;
1386 type SerializeTuple
= Impossible
<(), Error
>;
1387 type SerializeTupleStruct
= Impossible
<(), Error
>;
1388 type SerializeTupleVariant
= Impossible
<(), Error
>;
1389 type SerializeMap
= Impossible
<(), Error
>;
1390 type SerializeStruct
= Impossible
<(), Error
>;
1391 type SerializeStructVariant
= Impossible
<(), Error
>;
1393 fn serialize_bool(self, _v
: bool
) -> Result
<()> {
1394 Err(ser
::Error
::custom("expected RawValue"))
1397 fn serialize_i8(self, _v
: i8) -> Result
<()> {
1398 Err(ser
::Error
::custom("expected RawValue"))
1401 fn serialize_i16(self, _v
: i16) -> Result
<()> {
1402 Err(ser
::Error
::custom("expected RawValue"))
1405 fn serialize_i32(self, _v
: i32) -> Result
<()> {
1406 Err(ser
::Error
::custom("expected RawValue"))
1409 fn serialize_i64(self, _v
: i64) -> Result
<()> {
1410 Err(ser
::Error
::custom("expected RawValue"))
1413 serde_if_integer128
! {
1414 fn serialize_i128(self, _v
: i128
) -> Result
<()> {
1415 Err(ser
::Error
::custom("expected RawValue"))
1419 fn serialize_u8(self, _v
: u8) -> Result
<()> {
1420 Err(ser
::Error
::custom("expected RawValue"))
1423 fn serialize_u16(self, _v
: u16) -> Result
<()> {
1424 Err(ser
::Error
::custom("expected RawValue"))
1427 fn serialize_u32(self, _v
: u32) -> Result
<()> {
1428 Err(ser
::Error
::custom("expected RawValue"))
1431 fn serialize_u64(self, _v
: u64) -> Result
<()> {
1432 Err(ser
::Error
::custom("expected RawValue"))
1435 serde_if_integer128
! {
1436 fn serialize_u128(self, _v
: u128
) -> Result
<()> {
1437 Err(ser
::Error
::custom("expected RawValue"))
1441 fn serialize_f32(self, _v
: f32) -> Result
<()> {
1442 Err(ser
::Error
::custom("expected RawValue"))
1445 fn serialize_f64(self, _v
: f64) -> Result
<()> {
1446 Err(ser
::Error
::custom("expected RawValue"))
1449 fn serialize_char(self, _v
: char) -> Result
<()> {
1450 Err(ser
::Error
::custom("expected RawValue"))
1453 fn serialize_str(self, value
: &str) -> Result
<()> {
1454 let RawValueStrEmitter(serializer
) = self;
1457 .write_raw_fragment(&mut serializer
.writer
, value
)
1461 fn serialize_bytes(self, _value
: &[u8]) -> Result
<()> {
1462 Err(ser
::Error
::custom("expected RawValue"))
1465 fn serialize_none(self) -> Result
<()> {
1466 Err(ser
::Error
::custom("expected RawValue"))
1469 fn serialize_some
<T
>(self, _value
: &T
) -> Result
<()>
1471 T
: ?Sized
+ Serialize
,
1473 Err(ser
::Error
::custom("expected RawValue"))
1476 fn serialize_unit(self) -> Result
<()> {
1477 Err(ser
::Error
::custom("expected RawValue"))
1480 fn serialize_unit_struct(self, _name
: &'
static str) -> Result
<()> {
1481 Err(ser
::Error
::custom("expected RawValue"))
1484 fn serialize_unit_variant(
1486 _name
: &'
static str,
1487 _variant_index
: u32,
1488 _variant
: &'
static str,
1490 Err(ser
::Error
::custom("expected RawValue"))
1493 fn serialize_newtype_struct
<T
>(self, _name
: &'
static str, _value
: &T
) -> Result
<()>
1495 T
: ?Sized
+ Serialize
,
1497 Err(ser
::Error
::custom("expected RawValue"))
1500 fn serialize_newtype_variant
<T
>(
1502 _name
: &'
static str,
1503 _variant_index
: u32,
1504 _variant
: &'
static str,
1508 T
: ?Sized
+ Serialize
,
1510 Err(ser
::Error
::custom("expected RawValue"))
1513 fn serialize_seq(self, _len
: Option
<usize>) -> Result
<Self::SerializeSeq
> {
1514 Err(ser
::Error
::custom("expected RawValue"))
1517 fn serialize_tuple(self, _len
: usize) -> Result
<Self::SerializeTuple
> {
1518 Err(ser
::Error
::custom("expected RawValue"))
1521 fn serialize_tuple_struct(
1523 _name
: &'
static str,
1525 ) -> Result
<Self::SerializeTupleStruct
> {
1526 Err(ser
::Error
::custom("expected RawValue"))
1529 fn serialize_tuple_variant(
1531 _name
: &'
static str,
1532 _variant_index
: u32,
1533 _variant
: &'
static str,
1535 ) -> Result
<Self::SerializeTupleVariant
> {
1536 Err(ser
::Error
::custom("expected RawValue"))
1539 fn serialize_map(self, _len
: Option
<usize>) -> Result
<Self::SerializeMap
> {
1540 Err(ser
::Error
::custom("expected RawValue"))
1543 fn serialize_struct(self, _name
: &'
static str, _len
: usize) -> Result
<Self::SerializeStruct
> {
1544 Err(ser
::Error
::custom("expected RawValue"))
1547 fn serialize_struct_variant(
1549 _name
: &'
static str,
1550 _variant_index
: u32,
1551 _variant
: &'
static str,
1553 ) -> Result
<Self::SerializeStructVariant
> {
1554 Err(ser
::Error
::custom("expected RawValue"))
1558 /// Represents a character escape code in a type-safe manner.
1559 pub enum CharEscape
{
1560 /// An escaped quote `"`
1562 /// An escaped reverse solidus `\`
1564 /// An escaped solidus `/`
1566 /// An escaped backspace character (usually escaped as `\b`)
1568 /// An escaped form feed character (usually escaped as `\f`)
1570 /// An escaped line feed character (usually escaped as `\n`)
1572 /// An escaped carriage return character (usually escaped as `\r`)
1574 /// An escaped tab character (usually escaped as `\t`)
1576 /// An escaped ASCII plane control character (usually escaped as
1577 /// `\u00XX` where `XX` are two hex characters)
1583 fn from_escape_table(escape
: u8, byte
: u8) -> CharEscape
{
1585 self::BB
=> CharEscape
::Backspace
,
1586 self::TT
=> CharEscape
::Tab
,
1587 self::NN
=> CharEscape
::LineFeed
,
1588 self::FF
=> CharEscape
::FormFeed
,
1589 self::RR
=> CharEscape
::CarriageReturn
,
1590 self::QU
=> CharEscape
::Quote
,
1591 self::BS
=> CharEscape
::ReverseSolidus
,
1592 self::UU
=> CharEscape
::AsciiControl(byte
),
1593 _
=> unreachable
!(),
1598 /// This trait abstracts away serializing the JSON control characters, which allows the user to
1599 /// optionally pretty print the JSON output.
1600 pub trait Formatter
{
1601 /// Writes a `null` value to the specified writer.
1603 fn write_null
<W
>(&mut self, writer
: &mut W
) -> io
::Result
<()>
1605 W
: ?Sized
+ io
::Write
,
1607 writer
.write_all(b
"null")
1610 /// Writes a `true` or `false` value to the specified writer.
1612 fn write_bool
<W
>(&mut self, writer
: &mut W
, value
: bool
) -> io
::Result
<()>
1614 W
: ?Sized
+ io
::Write
,
1624 /// Writes an integer value like `-123` to the specified writer.
1626 fn write_i8
<W
>(&mut self, writer
: &mut W
, value
: i8) -> io
::Result
<()>
1628 W
: ?Sized
+ io
::Write
,
1630 let mut buffer
= itoa
::Buffer
::new();
1631 let s
= buffer
.format(value
);
1632 writer
.write_all(s
.as_bytes())
1635 /// Writes an integer value like `-123` to the specified writer.
1637 fn write_i16
<W
>(&mut self, writer
: &mut W
, value
: i16) -> io
::Result
<()>
1639 W
: ?Sized
+ io
::Write
,
1641 let mut buffer
= itoa
::Buffer
::new();
1642 let s
= buffer
.format(value
);
1643 writer
.write_all(s
.as_bytes())
1646 /// Writes an integer value like `-123` to the specified writer.
1648 fn write_i32
<W
>(&mut self, writer
: &mut W
, value
: i32) -> io
::Result
<()>
1650 W
: ?Sized
+ io
::Write
,
1652 let mut buffer
= itoa
::Buffer
::new();
1653 let s
= buffer
.format(value
);
1654 writer
.write_all(s
.as_bytes())
1657 /// Writes an integer value like `-123` to the specified writer.
1659 fn write_i64
<W
>(&mut self, writer
: &mut W
, value
: i64) -> io
::Result
<()>
1661 W
: ?Sized
+ io
::Write
,
1663 let mut buffer
= itoa
::Buffer
::new();
1664 let s
= buffer
.format(value
);
1665 writer
.write_all(s
.as_bytes())
1668 /// Writes an integer value like `123` to the specified writer.
1670 fn write_u8
<W
>(&mut self, writer
: &mut W
, value
: u8) -> io
::Result
<()>
1672 W
: ?Sized
+ io
::Write
,
1674 let mut buffer
= itoa
::Buffer
::new();
1675 let s
= buffer
.format(value
);
1676 writer
.write_all(s
.as_bytes())
1679 /// Writes an integer value like `123` to the specified writer.
1681 fn write_u16
<W
>(&mut self, writer
: &mut W
, value
: u16) -> io
::Result
<()>
1683 W
: ?Sized
+ io
::Write
,
1685 let mut buffer
= itoa
::Buffer
::new();
1686 let s
= buffer
.format(value
);
1687 writer
.write_all(s
.as_bytes())
1690 /// Writes an integer value like `123` to the specified writer.
1692 fn write_u32
<W
>(&mut self, writer
: &mut W
, value
: u32) -> io
::Result
<()>
1694 W
: ?Sized
+ io
::Write
,
1696 let mut buffer
= itoa
::Buffer
::new();
1697 let s
= buffer
.format(value
);
1698 writer
.write_all(s
.as_bytes())
1701 /// Writes an integer value like `123` to the specified writer.
1703 fn write_u64
<W
>(&mut self, writer
: &mut W
, value
: u64) -> io
::Result
<()>
1705 W
: ?Sized
+ io
::Write
,
1707 let mut buffer
= itoa
::Buffer
::new();
1708 let s
= buffer
.format(value
);
1709 writer
.write_all(s
.as_bytes())
1712 /// Writes a floating point value like `-31.26e+12` to the specified writer.
1714 fn write_f32
<W
>(&mut self, writer
: &mut W
, value
: f32) -> io
::Result
<()>
1716 W
: ?Sized
+ io
::Write
,
1718 let mut buffer
= ryu
::Buffer
::new();
1719 let s
= buffer
.format_finite(value
);
1720 writer
.write_all(s
.as_bytes())
1723 /// Writes a floating point value like `-31.26e+12` to the specified writer.
1725 fn write_f64
<W
>(&mut self, writer
: &mut W
, value
: f64) -> io
::Result
<()>
1727 W
: ?Sized
+ io
::Write
,
1729 let mut buffer
= ryu
::Buffer
::new();
1730 let s
= buffer
.format_finite(value
);
1731 writer
.write_all(s
.as_bytes())
1734 /// Writes a number that has already been rendered to a string.
1736 fn write_number_str
<W
>(&mut self, writer
: &mut W
, value
: &str) -> io
::Result
<()>
1738 W
: ?Sized
+ io
::Write
,
1740 writer
.write_all(value
.as_bytes())
1743 /// Called before each series of `write_string_fragment` and
1744 /// `write_char_escape`. Writes a `"` to the specified writer.
1746 fn begin_string
<W
>(&mut self, writer
: &mut W
) -> io
::Result
<()>
1748 W
: ?Sized
+ io
::Write
,
1750 writer
.write_all(b
"\"")
1753 /// Called after each series of `write_string_fragment` and
1754 /// `write_char_escape`. Writes a `"` to the specified writer.
1756 fn end_string
<W
>(&mut self, writer
: &mut W
) -> io
::Result
<()>
1758 W
: ?Sized
+ io
::Write
,
1760 writer
.write_all(b
"\"")
1763 /// Writes a string fragment that doesn't need any escaping to the
1764 /// specified writer.
1766 fn write_string_fragment
<W
>(&mut self, writer
: &mut W
, fragment
: &str) -> io
::Result
<()>
1768 W
: ?Sized
+ io
::Write
,
1770 writer
.write_all(fragment
.as_bytes())
1773 /// Writes a character escape code to the specified writer.
1775 fn write_char_escape
<W
>(&mut self, writer
: &mut W
, char_escape
: CharEscape
) -> io
::Result
<()>
1777 W
: ?Sized
+ io
::Write
,
1779 use self::CharEscape
::*;
1781 let s
= match char_escape
{
1783 ReverseSolidus
=> b
"\\\\",
1785 Backspace
=> b
"\\b",
1788 CarriageReturn
=> b
"\\r",
1790 AsciiControl(byte
) => {
1791 static HEX_DIGITS
: [u8; 16] = *b
"0123456789abcdef";
1797 HEX_DIGITS
[(byte
>> 4) as usize],
1798 HEX_DIGITS
[(byte
& 0xF) as usize],
1800 return writer
.write_all(bytes
);
1807 /// Called before every array. Writes a `[` to the specified
1810 fn begin_array
<W
>(&mut self, writer
: &mut W
) -> io
::Result
<()>
1812 W
: ?Sized
+ io
::Write
,
1814 writer
.write_all(b
"[")
1817 /// Called after every array. Writes a `]` to the specified
1820 fn end_array
<W
>(&mut self, writer
: &mut W
) -> io
::Result
<()>
1822 W
: ?Sized
+ io
::Write
,
1824 writer
.write_all(b
"]")
1827 /// Called before every array value. Writes a `,` if needed to
1828 /// the specified writer.
1830 fn begin_array_value
<W
>(&mut self, writer
: &mut W
, first
: bool
) -> io
::Result
<()>
1832 W
: ?Sized
+ io
::Write
,
1837 writer
.write_all(b
",")
1841 /// Called after every array value.
1843 fn end_array_value
<W
>(&mut self, _writer
: &mut W
) -> io
::Result
<()>
1845 W
: ?Sized
+ io
::Write
,
1850 /// Called before every object. Writes a `{` to the specified
1853 fn begin_object
<W
>(&mut self, writer
: &mut W
) -> io
::Result
<()>
1855 W
: ?Sized
+ io
::Write
,
1857 writer
.write_all(b
"{")
1860 /// Called after every object. Writes a `}` to the specified
1863 fn end_object
<W
>(&mut self, writer
: &mut W
) -> io
::Result
<()>
1865 W
: ?Sized
+ io
::Write
,
1867 writer
.write_all(b
"}")
1870 /// Called before every object key.
1872 fn begin_object_key
<W
>(&mut self, writer
: &mut W
, first
: bool
) -> io
::Result
<()>
1874 W
: ?Sized
+ io
::Write
,
1879 writer
.write_all(b
",")
1883 /// Called after every object key. A `:` should be written to the
1884 /// specified writer by either this method or
1885 /// `begin_object_value`.
1887 fn end_object_key
<W
>(&mut self, _writer
: &mut W
) -> io
::Result
<()>
1889 W
: ?Sized
+ io
::Write
,
1894 /// Called before every object value. A `:` should be written to
1895 /// the specified writer by either this method or
1896 /// `end_object_key`.
1898 fn begin_object_value
<W
>(&mut self, writer
: &mut W
) -> io
::Result
<()>
1900 W
: ?Sized
+ io
::Write
,
1902 writer
.write_all(b
":")
1905 /// Called after every object value.
1907 fn end_object_value
<W
>(&mut self, _writer
: &mut W
) -> io
::Result
<()>
1909 W
: ?Sized
+ io
::Write
,
1914 /// Writes a raw JSON fragment that doesn't need any escaping to the
1915 /// specified writer.
1917 fn write_raw_fragment
<W
>(&mut self, writer
: &mut W
, fragment
: &str) -> io
::Result
<()>
1919 W
: ?Sized
+ io
::Write
,
1921 writer
.write_all(fragment
.as_bytes())
1925 /// This structure compacts a JSON value with no extra whitespace.
1926 #[derive(Clone, Debug)]
1927 pub struct CompactFormatter
;
1929 impl Formatter
for CompactFormatter {}
1931 /// This structure pretty prints a JSON value to make it human readable.
1932 #[derive(Clone, Debug)]
1933 pub struct PrettyFormatter
<'a
> {
1934 current_indent
: usize,
1939 impl<'a
> PrettyFormatter
<'a
> {
1940 /// Construct a pretty printer formatter that defaults to using two spaces for indentation.
1941 pub fn new() -> Self {
1942 PrettyFormatter
::with_indent(b
" ")
1945 /// Construct a pretty printer formatter that uses the `indent` string for indentation.
1946 pub fn with_indent(indent
: &'a
[u8]) -> Self {
1955 impl<'a
> Default
for PrettyFormatter
<'a
> {
1956 fn default() -> Self {
1957 PrettyFormatter
::new()
1961 impl<'a
> Formatter
for PrettyFormatter
<'a
> {
1963 fn begin_array
<W
>(&mut self, writer
: &mut W
) -> io
::Result
<()>
1965 W
: ?Sized
+ io
::Write
,
1967 self.current_indent
+= 1;
1968 self.has_value
= false;
1969 writer
.write_all(b
"[")
1973 fn end_array
<W
>(&mut self, writer
: &mut W
) -> io
::Result
<()>
1975 W
: ?Sized
+ io
::Write
,
1977 self.current_indent
-= 1;
1980 tri
!(writer
.write_all(b
"\n"));
1981 tri
!(indent(writer
, self.current_indent
, self.indent
));
1984 writer
.write_all(b
"]")
1988 fn begin_array_value
<W
>(&mut self, writer
: &mut W
, first
: bool
) -> io
::Result
<()>
1990 W
: ?Sized
+ io
::Write
,
1993 tri
!(writer
.write_all(b
"\n"));
1995 tri
!(writer
.write_all(b
",\n"));
1997 tri
!(indent(writer
, self.current_indent
, self.indent
));
2002 fn end_array_value
<W
>(&mut self, _writer
: &mut W
) -> io
::Result
<()>
2004 W
: ?Sized
+ io
::Write
,
2006 self.has_value
= true;
2011 fn begin_object
<W
>(&mut self, writer
: &mut W
) -> io
::Result
<()>
2013 W
: ?Sized
+ io
::Write
,
2015 self.current_indent
+= 1;
2016 self.has_value
= false;
2017 writer
.write_all(b
"{")
2021 fn end_object
<W
>(&mut self, writer
: &mut W
) -> io
::Result
<()>
2023 W
: ?Sized
+ io
::Write
,
2025 self.current_indent
-= 1;
2028 tri
!(writer
.write_all(b
"\n"));
2029 tri
!(indent(writer
, self.current_indent
, self.indent
));
2032 writer
.write_all(b
"}")
2036 fn begin_object_key
<W
>(&mut self, writer
: &mut W
, first
: bool
) -> io
::Result
<()>
2038 W
: ?Sized
+ io
::Write
,
2041 tri
!(writer
.write_all(b
"\n"));
2043 tri
!(writer
.write_all(b
",\n"));
2045 indent(writer
, self.current_indent
, self.indent
)
2049 fn begin_object_value
<W
>(&mut self, writer
: &mut W
) -> io
::Result
<()>
2051 W
: ?Sized
+ io
::Write
,
2053 writer
.write_all(b
": ")
2057 fn end_object_value
<W
>(&mut self, _writer
: &mut W
) -> io
::Result
<()>
2059 W
: ?Sized
+ io
::Write
,
2061 self.has_value
= true;
2066 fn format_escaped_str
<W
, F
>(writer
: &mut W
, formatter
: &mut F
, value
: &str) -> io
::Result
<()>
2068 W
: ?Sized
+ io
::Write
,
2069 F
: ?Sized
+ Formatter
,
2071 tri
!(formatter
.begin_string(writer
));
2072 tri
!(format_escaped_str_contents(writer
, formatter
, value
));
2073 tri
!(formatter
.end_string(writer
));
2077 fn format_escaped_str_contents
<W
, F
>(
2083 W
: ?Sized
+ io
::Write
,
2084 F
: ?Sized
+ Formatter
,
2086 let bytes
= value
.as_bytes();
2090 for (i
, &byte
) in bytes
.iter().enumerate() {
2091 let escape
= ESCAPE
[byte
as usize];
2097 tri
!(formatter
.write_string_fragment(writer
, &value
[start
..i
]));
2100 let char_escape
= CharEscape
::from_escape_table(escape
, byte
);
2101 tri
!(formatter
.write_char_escape(writer
, char_escape
));
2106 if start
!= bytes
.len() {
2107 tri
!(formatter
.write_string_fragment(writer
, &value
[start
..]));
2113 const BB
: u8 = b'b'
; // \x08
2114 const TT
: u8 = b't'
; // \x09
2115 const NN
: u8 = b'n'
; // \x0A
2116 const FF
: u8 = b'f'
; // \x0C
2117 const RR
: u8 = b'r'
; // \x0D
2118 const QU
: u8 = b'
"'; // \x22
2119 const BS: u8 = b'\\'; // \x5C
2120 const UU: u8 = b'u'; // \x00...\x1F except the ones above
2123 // Lookup table of escape sequences. A value of b'x' at index i means that byte
2124 // i is escaped as "\x
" in JSON. A value of 0 means that byte i is not escaped.
2125 static ESCAPE: [u8; 256] = [
2126 // 1 2 3 4 5 6 7 8 9 A B C D E F
2127 UU, UU, UU, UU, UU, UU, UU, UU, BB, TT, NN, UU, FF, RR, UU, UU, // 0
2128 UU, UU, UU, UU, UU, UU, UU, UU, UU, UU, UU, UU, UU, UU, UU, UU, // 1
2129 __, __, QU, __, __, __, __, __, __, __, __, __, __, __, __, __, // 2
2130 __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // 3
2131 __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // 4
2132 __, __, __, __, __, __, __, __, __, __, __, __, BS, __, __, __, // 5
2133 __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // 6
2134 __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // 7
2135 __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // 8
2136 __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // 9
2137 __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // A
2138 __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // B
2139 __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // C
2140 __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // D
2141 __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // E
2142 __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // F
2145 /// Serialize the given data structure as JSON into the IO stream.
2149 /// Serialization can fail if `T`'s implementation of `Serialize` decides to
2150 /// fail, or if `T` contains a map with non-string keys.
2152 pub fn to_writer<W, T>(writer: W, value: &T) -> Result<()>
2155 T: ?Sized + Serialize,
2157 let mut ser = Serializer::new(writer);
2158 tri!(value.serialize(&mut ser));
2162 /// Serialize the given data structure as pretty-printed JSON into the IO
2167 /// Serialization can fail if `T`'s implementation of `Serialize` decides to
2168 /// fail, or if `T` contains a map with non-string keys.
2170 pub fn to_writer_pretty<W, T>(writer: W, value: &T) -> Result<()>
2173 T: ?Sized + Serialize,
2175 let mut ser = Serializer::pretty(writer);
2176 tri!(value.serialize(&mut ser));
2180 /// Serialize the given data structure as a JSON byte vector.
2184 /// Serialization can fail if `T`'s implementation of `Serialize` decides to
2185 /// fail, or if `T` contains a map with non-string keys.
2187 pub fn to_vec<T>(value: &T) -> Result<Vec<u8>>
2189 T: ?Sized + Serialize,
2191 let mut writer = Vec::with_capacity(128);
2192 tri!(to_writer(&mut writer, value));
2196 /// Serialize the given data structure as a pretty-printed JSON byte vector.
2200 /// Serialization can fail if `T`'s implementation of `Serialize` decides to
2201 /// fail, or if `T` contains a map with non-string keys.
2203 pub fn to_vec_pretty<T>(value: &T) -> Result<Vec<u8>>
2205 T: ?Sized + Serialize,
2207 let mut writer = Vec::with_capacity(128);
2208 tri!(to_writer_pretty(&mut writer, value));
2212 /// Serialize the given data structure as a String of JSON.
2216 /// Serialization can fail if `T`'s implementation of `Serialize` decides to
2217 /// fail, or if `T` contains a map with non-string keys.
2219 pub fn to_string<T>(value: &T) -> Result<String>
2221 T: ?Sized + Serialize,
2223 let vec = tri!(to_vec(value));
2224 let string = unsafe {
2225 // We do not emit invalid UTF-8.
2226 String::from_utf8_unchecked(vec)
2231 /// Serialize the given data structure as a pretty-printed String of JSON.
2235 /// Serialization can fail if `T`'s implementation of `Serialize` decides to
2236 /// fail, or if `T` contains a map with non-string keys.
2238 pub fn to_string_pretty<T>(value: &T) -> Result<String>
2240 T: ?Sized + Serialize,
2242 let vec = tri!(to_vec_pretty(value));
2243 let string = unsafe {
2244 // We do not emit invalid UTF-8.
2245 String::from_utf8_unchecked(vec)
2250 fn indent<W>(wr: &mut W, n: usize, s: &[u8]) -> io::Result<()>
2252 W: ?Sized + io::Write,
2255 tri!(wr.write_all(s));