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