1use core::{
6 fmt::{self, Display},
7 num::FpCategory,
8};
9use std::{io, str};
10
11use faststr::FastStr;
12use serde::{
13 de::Unexpected,
14 ser::{self, Impossible, Serialize, Serializer as SerdeSerializer},
15};
16
17use super::de::tri;
18use crate::{
19 config::SerializeCfg,
20 error::{Error, ErrorCode, Result},
21 format::{CompactFormatter, Formatter, PrettyFormatter},
22 lazyvalue::value::HasEsc,
23 writer::WriteExt,
24 OwnedLazyValue,
25};
26pub struct Serializer<W, F = CompactFormatter> {
28 writer: W,
29 formatter: F,
30 cfg: SerializeCfg,
33}
34
35impl<W> Serializer<W>
36where
37 W: WriteExt,
38{
39 #[inline]
41 pub fn new(writer: W) -> Self {
42 Serializer::with_formatter(writer, CompactFormatter)
43 }
44}
45
46impl<'a, W> Serializer<W, PrettyFormatter<'a>>
47where
48 W: WriteExt,
49{
50 #[inline]
52 pub fn pretty(writer: W) -> Self {
53 Serializer::with_formatter(writer, PrettyFormatter::new())
54 }
55}
56
57impl<W, F> Serializer<W, F>
58where
59 W: WriteExt,
60 F: Formatter,
61{
62 #[inline]
65 pub fn with_formatter(writer: W, formatter: F) -> Self {
66 Serializer {
67 writer,
68 formatter,
69 cfg: SerializeCfg::default(),
70 }
71 }
72
73 #[inline]
85 pub fn sort_map_keys(mut self) -> Self {
86 self.cfg.sort_map_keys = true;
87 self
88 }
89
90 pub(crate) fn with_cfg(mut self, cfg: SerializeCfg) -> Self {
91 self.cfg = cfg;
92 self
93 }
94
95 #[inline]
97 pub fn into_inner(self) -> W {
98 self.writer
99 }
100}
101
102impl<'a, W, F> ser::Serializer for &'a mut Serializer<W, F>
103where
104 W: WriteExt,
105 F: Formatter + Clone,
106{
107 type Ok = ();
108 type Error = Error;
109
110 type SerializeSeq = Compound<'a, W, F>;
111 type SerializeTuple = Compound<'a, W, F>;
112 type SerializeTupleStruct = Compound<'a, W, F>;
113 type SerializeTupleVariant = Compound<'a, W, F>;
114 type SerializeMap = Compound<'a, W, F>;
115 type SerializeStruct = Compound<'a, W, F>;
116 type SerializeStructVariant = Compound<'a, W, F>;
117
118 #[inline]
119 fn serialize_bool(self, value: bool) -> Result<()> {
120 self.formatter
121 .write_bool(&mut self.writer, value)
122 .map_err(Error::io)
123 }
124
125 #[inline]
126 fn serialize_i8(self, value: i8) -> Result<()> {
127 self.formatter
128 .write_i8(&mut self.writer, value)
129 .map_err(Error::io)
130 }
131
132 #[inline]
133 fn serialize_i16(self, value: i16) -> Result<()> {
134 self.formatter
135 .write_i16(&mut self.writer, value)
136 .map_err(Error::io)
137 }
138
139 #[inline]
140 fn serialize_i32(self, value: i32) -> Result<()> {
141 self.formatter
142 .write_i32(&mut self.writer, value)
143 .map_err(Error::io)
144 }
145
146 #[inline]
147 fn serialize_i64(self, value: i64) -> Result<()> {
148 self.formatter
149 .write_i64(&mut self.writer, value)
150 .map_err(Error::io)
151 }
152
153 fn serialize_i128(self, value: i128) -> Result<()> {
154 self.formatter
155 .write_i128(&mut self.writer, value)
156 .map_err(Error::io)
157 }
158
159 #[inline]
160 fn serialize_u8(self, value: u8) -> Result<()> {
161 self.formatter
162 .write_u8(&mut self.writer, value)
163 .map_err(Error::io)
164 }
165
166 #[inline]
167 fn serialize_u16(self, value: u16) -> Result<()> {
168 self.formatter
169 .write_u16(&mut self.writer, value)
170 .map_err(Error::io)
171 }
172
173 #[inline]
174 fn serialize_u32(self, value: u32) -> Result<()> {
175 self.formatter
176 .write_u32(&mut self.writer, value)
177 .map_err(Error::io)
178 }
179
180 #[inline]
181 fn serialize_u64(self, value: u64) -> Result<()> {
182 self.formatter
183 .write_u64(&mut self.writer, value)
184 .map_err(Error::io)
185 }
186
187 fn serialize_u128(self, value: u128) -> Result<()> {
188 self.formatter
189 .write_u128(&mut self.writer, value)
190 .map_err(Error::io)
191 }
192
193 #[inline]
194 fn serialize_f32(self, value: f32) -> Result<()> {
195 match value.classify() {
196 FpCategory::Nan | FpCategory::Infinite => self
197 .formatter
198 .write_null(&mut self.writer)
199 .map_err(Error::io),
200 _ => self
201 .formatter
202 .write_f32(&mut self.writer, value)
203 .map_err(Error::io),
204 }
205 }
206
207 #[inline]
208 fn serialize_f64(self, value: f64) -> Result<()> {
209 match value.classify() {
210 FpCategory::Nan | FpCategory::Infinite => self
211 .formatter
212 .write_null(&mut self.writer)
213 .map_err(Error::io),
214 _ => self
215 .formatter
216 .write_f64(&mut self.writer, value)
217 .map_err(Error::io),
218 }
219 }
220
221 #[inline]
222 fn serialize_char(self, value: char) -> Result<()> {
223 let mut buf = [0; 4];
225 self.serialize_str(value.encode_utf8(&mut buf))
226 }
227
228 #[inline]
229 fn serialize_str(self, value: &str) -> Result<()> {
230 self.formatter
231 .write_string_fast(&mut self.writer, value, true)
232 .map_err(Error::io)
233 }
234
235 #[inline]
236 fn serialize_bytes(self, value: &[u8]) -> Result<()> {
237 use serde::ser::SerializeSeq;
238 let mut seq = tri!(self.serialize_seq(Some(value.len())));
239 for byte in value {
240 tri!(seq.serialize_element(byte));
241 }
242 seq.end()
243 }
244
245 #[inline]
246 fn serialize_unit(self) -> Result<()> {
247 self.formatter
248 .write_null(&mut self.writer)
249 .map_err(Error::io)
250 }
251
252 #[inline]
253 fn serialize_unit_struct(self, _name: &'static str) -> Result<()> {
254 self.serialize_unit()
255 }
256
257 #[inline]
258 fn serialize_unit_variant(
259 self,
260 _name: &'static str,
261 _variant_index: u32,
262 variant: &'static str,
263 ) -> Result<()> {
264 self.serialize_str(variant)
265 }
266
267 #[inline]
269 fn serialize_newtype_struct<T>(self, _name: &'static str, value: &T) -> Result<()>
270 where
271 T: ?Sized + Serialize,
272 {
273 value.serialize(self)
274 }
275
276 #[inline]
277 fn serialize_newtype_variant<T>(
278 self,
279 _name: &'static str,
280 _variant_index: u32,
281 variant: &'static str,
282 value: &T,
283 ) -> Result<()>
284 where
285 T: ?Sized + Serialize,
286 {
287 tri!(self
288 .formatter
289 .begin_object(&mut self.writer)
290 .map_err(Error::io));
291 tri!(self
292 .formatter
293 .begin_object_key(&mut self.writer, true)
294 .map_err(Error::io));
295 tri!(self.serialize_str(variant));
296 tri!(self
297 .formatter
298 .end_object_key(&mut self.writer)
299 .map_err(Error::io));
300 tri!(self
301 .formatter
302 .begin_object_value(&mut self.writer)
303 .map_err(Error::io));
304 tri!(value.serialize(&mut *self));
305 tri!(self
306 .formatter
307 .end_object_value(&mut self.writer)
308 .map_err(Error::io));
309 self.formatter
310 .end_object(&mut self.writer)
311 .map_err(Error::io)
312 }
313
314 #[inline]
315 fn serialize_none(self) -> Result<()> {
316 self.serialize_unit()
317 }
318
319 #[inline]
320 fn serialize_some<T>(self, value: &T) -> Result<()>
321 where
322 T: ?Sized + Serialize,
323 {
324 value.serialize(self)
325 }
326
327 #[inline]
328 fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq> {
329 tri!(self
330 .formatter
331 .begin_array(&mut self.writer)
332 .map_err(Error::io));
333 if len == Some(0) {
334 tri!(self
335 .formatter
336 .end_array(&mut self.writer)
337 .map_err(Error::io));
338 Ok(Compound::Map {
339 ser: self,
340 state: MapState::Stream(State::Empty),
341 })
342 } else {
343 Ok(Compound::Map {
344 ser: self,
345 state: MapState::Stream(State::First),
346 })
347 }
348 }
349
350 #[inline]
351 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple> {
352 self.serialize_seq(Some(len))
353 }
354
355 #[inline]
356 fn serialize_tuple_struct(
357 self,
358 _name: &'static str,
359 len: usize,
360 ) -> Result<Self::SerializeTupleStruct> {
361 self.serialize_seq(Some(len))
362 }
363
364 #[inline]
365 fn serialize_tuple_variant(
366 self,
367 _name: &'static str,
368 _variant_index: u32,
369 variant: &'static str,
370 len: usize,
371 ) -> Result<Self::SerializeTupleVariant> {
372 tri!(self
373 .formatter
374 .begin_object(&mut self.writer)
375 .map_err(Error::io));
376 tri!(self
377 .formatter
378 .begin_object_key(&mut self.writer, true)
379 .map_err(Error::io));
380 tri!(self.serialize_str(variant));
381 tri!(self
382 .formatter
383 .end_object_key(&mut self.writer)
384 .map_err(Error::io));
385 tri!(self
386 .formatter
387 .begin_object_value(&mut self.writer)
388 .map_err(Error::io));
389 self.serialize_seq(Some(len))
390 }
391
392 #[inline]
393 fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap> {
394 tri!(self
395 .formatter
396 .begin_object(&mut self.writer)
397 .map_err(Error::io));
398 if self.cfg.sort_map_keys {
399 Ok(Compound::Map {
400 ser: self,
401 state: MapState::Sorted {
402 entries: Vec::with_capacity(len.unwrap_or(0)),
403 next_key: None,
404 },
405 })
406 } else if len == Some(0) {
407 tri!(self
408 .formatter
409 .end_object(&mut self.writer)
410 .map_err(Error::io));
411 Ok(Compound::Map {
412 ser: self,
413 state: MapState::Stream(State::Empty),
414 })
415 } else {
416 Ok(Compound::Map {
417 ser: self,
418 state: MapState::Stream(State::First),
419 })
420 }
421 }
422
423 #[inline]
424 fn serialize_struct(self, name: &'static str, len: usize) -> Result<Self::SerializeStruct> {
425 match name {
426 crate::serde::rawnumber::TOKEN | crate::lazyvalue::TOKEN => {
427 Ok(Compound::RawValue { ser: self })
428 }
429 _ => self.serialize_map(Some(len)),
430 }
431 }
432
433 #[inline]
434 fn serialize_struct_variant(
435 self,
436 _name: &'static str,
437 _variant_index: u32,
438 variant: &'static str,
439 len: usize,
440 ) -> Result<Self::SerializeStructVariant> {
441 tri!(self
442 .formatter
443 .begin_object(&mut self.writer)
444 .map_err(Error::io));
445 tri!(self
446 .formatter
447 .begin_object_key(&mut self.writer, true)
448 .map_err(Error::io));
449 tri!(self.serialize_str(variant));
450 tri!(self
451 .formatter
452 .end_object_key(&mut self.writer)
453 .map_err(Error::io));
454 tri!(self
455 .formatter
456 .begin_object_value(&mut self.writer)
457 .map_err(Error::io));
458 self.serialize_map(Some(len))
459 }
460
461 fn collect_str<T>(self, value: &T) -> Result<()>
463 where
464 T: ?Sized + Display,
465 {
466 use self::fmt::Write;
467
468 struct Adapter<'ser, W: 'ser, F: 'ser> {
469 writer: &'ser mut W,
470 formatter: &'ser mut F,
471 error: Option<io::Error>,
472 }
473
474 impl<'ser, W, F> Write for Adapter<'ser, W, F>
475 where
476 W: WriteExt,
477 F: Formatter,
478 {
479 fn write_str(&mut self, s: &str) -> fmt::Result {
480 debug_assert!(self.error.is_none());
481 match self.formatter.write_string_fast(self.writer, s, false) {
482 Ok(()) => Ok(()),
483 Err(err) => {
484 self.error = Some(err);
485 Err(fmt::Error)
486 }
487 }
488 }
489 }
490
491 tri!(self
492 .formatter
493 .begin_string(&mut self.writer)
494 .map_err(Error::io));
495 let mut adapter = Adapter {
496 writer: &mut self.writer,
497 formatter: &mut self.formatter,
498 error: None,
499 };
500
501 match write!(adapter, "{value}") {
502 Ok(()) => {
503 debug_assert!(adapter.error.is_none());
504 }
505 Err(fmt::Error) => {
506 return Err(Error::io(adapter.error.expect("there should be an error")))
507 }
508 }
509 tri!(self
510 .formatter
511 .end_string(&mut self.writer)
512 .map_err(Error::io));
513 Ok(())
514 }
515}
516
517#[doc(hidden)]
519#[derive(Eq, PartialEq)]
520pub enum State {
521 Empty,
522 First,
523 Rest,
524}
525
526#[doc(hidden)]
528pub enum Compound<'a, W: 'a, F: 'a> {
529 Map {
530 ser: &'a mut Serializer<W, F>,
531 state: MapState,
532 },
533
534 RawValue {
535 ser: &'a mut Serializer<W, F>,
536 },
537}
538
539pub enum MapState {
540 Stream(State),
541 Sorted {
542 entries: Vec<(String, Vec<u8>)>,
543 next_key: Option<String>,
544 },
545}
546
547fn write_sorted_entries<W, F>(
548 ser: &mut Serializer<W, F>,
549 mut entries: Vec<(String, Vec<u8>)>,
550) -> Result<()>
551where
552 W: WriteExt,
553 F: Formatter,
554{
555 entries.sort_by(|a, b| a.0.cmp(&b.0));
556
557 let mut first = true;
558 for (key, value_buf) in entries.into_iter() {
559 tri!(ser
560 .formatter
561 .begin_object_key(&mut ser.writer, first)
562 .map_err(Error::io));
563 first = false;
564
565 tri!(SerdeSerializer::serialize_str(&mut *ser, &key));
566
567 tri!(ser
568 .formatter
569 .end_object_key(&mut ser.writer)
570 .map_err(Error::io));
571
572 tri!(ser
573 .formatter
574 .begin_object_value(&mut ser.writer)
575 .map_err(Error::io));
576 let raw = unsafe { str::from_utf8_unchecked(&value_buf) };
577 tri!(ser
578 .formatter
579 .write_raw_value(&mut ser.writer, raw)
580 .map_err(Error::io));
581 tri!(ser
582 .formatter
583 .end_object_value(&mut ser.writer)
584 .map_err(Error::io));
585 }
586
587 ser.formatter.end_object(&mut ser.writer).map_err(Error::io)
588}
589
590impl<'a, W, F> ser::SerializeSeq for Compound<'a, W, F>
591where
592 W: WriteExt,
593 F: Formatter,
594{
595 type Ok = ();
596 type Error = Error;
597
598 #[inline]
599 fn serialize_element<T>(&mut self, value: &T) -> Result<()>
600 where
601 T: ?Sized + Serialize,
602 {
603 match self {
604 Compound::Map { ser, state } => match state {
605 MapState::Stream(ref mut map_state) => {
606 tri!(ser
607 .formatter
608 .begin_array_value(&mut ser.writer, *map_state == State::First)
609 .map_err(Error::io));
610 *map_state = State::Rest;
611 tri!(value.serialize(&mut **ser));
612 ser.formatter
613 .end_array_value(&mut ser.writer)
614 .map_err(Error::io)
615 }
616
617 MapState::Sorted { .. } => unreachable!(),
618 },
619
620 Compound::RawValue { .. } => unreachable!(),
621 }
622 }
623
624 #[inline]
625 fn end(self) -> Result<()> {
626 match self {
627 Compound::Map { ser, state } => match state {
628 MapState::Stream(map_state) => match map_state {
629 State::Empty => Ok(()),
630 _ => ser.formatter.end_array(&mut ser.writer).map_err(Error::io),
631 },
632
633 MapState::Sorted { .. } => unreachable!(),
634 },
635
636 Compound::RawValue { .. } => unreachable!(),
637 }
638 }
639}
640
641impl<'a, W, F> ser::SerializeTuple for Compound<'a, W, F>
642where
643 W: WriteExt,
644 F: Formatter,
645{
646 type Ok = ();
647 type Error = Error;
648
649 #[inline]
650 fn serialize_element<T>(&mut self, value: &T) -> Result<()>
651 where
652 T: ?Sized + Serialize,
653 {
654 ser::SerializeSeq::serialize_element(self, value)
655 }
656
657 #[inline]
658 fn end(self) -> Result<()> {
659 ser::SerializeSeq::end(self)
660 }
661}
662
663impl<'a, W, F> ser::SerializeTupleStruct for Compound<'a, W, F>
664where
665 W: WriteExt,
666 F: Formatter,
667{
668 type Ok = ();
669 type Error = Error;
670
671 #[inline]
672 fn serialize_field<T>(&mut self, value: &T) -> Result<()>
673 where
674 T: ?Sized + Serialize,
675 {
676 ser::SerializeSeq::serialize_element(self, value)
677 }
678
679 #[inline]
680 fn end(self) -> Result<()> {
681 ser::SerializeSeq::end(self)
682 }
683}
684
685impl<'a, W, F> ser::SerializeTupleVariant for Compound<'a, W, F>
686where
687 W: WriteExt,
688 F: Formatter,
689{
690 type Ok = ();
691 type Error = Error;
692
693 #[inline]
694 fn serialize_field<T>(&mut self, value: &T) -> Result<()>
695 where
696 T: ?Sized + Serialize,
697 {
698 ser::SerializeSeq::serialize_element(self, value)
699 }
700
701 #[inline]
702 fn end(self) -> Result<()> {
703 match self {
704 Compound::Map { ser, state } => match state {
705 MapState::Stream(map_state) => {
706 match map_state {
707 State::Empty => {}
708 _ => tri!(ser.formatter.end_array(&mut ser.writer).map_err(Error::io)),
709 }
710 tri!(ser
711 .formatter
712 .end_object_value(&mut ser.writer)
713 .map_err(Error::io));
714 ser.formatter.end_object(&mut ser.writer).map_err(Error::io)
715 }
716
717 MapState::Sorted { entries, next_key } => {
718 debug_assert!(next_key.is_none());
719 write_sorted_entries(ser, entries)
720 }
721 },
722
723 Compound::RawValue { .. } => unreachable!(),
724 }
725 }
726}
727
728impl<'a, W, F> ser::SerializeMap for Compound<'a, W, F>
729where
730 W: WriteExt,
731 F: Formatter + Clone,
732{
733 type Ok = ();
734 type Error = Error;
735
736 #[inline]
737 fn serialize_key<T>(&mut self, key: &T) -> Result<()>
738 where
739 T: ?Sized + Serialize,
740 {
741 match self {
742 Compound::Map { ser, state } => match state {
743 MapState::Stream(ref mut map_state) => {
744 tri!(ser
745 .formatter
746 .begin_object_key(&mut ser.writer, *map_state == State::First)
747 .map_err(Error::io));
748 *map_state = State::Rest;
749
750 tri!(key.serialize(MapKeySerializer { ser: *ser }));
751
752 ser.formatter
753 .end_object_key(&mut ser.writer)
754 .map_err(Error::io)
755 }
756
757 MapState::Sorted { next_key, .. } => {
758 let key_str = tri!(key.serialize(SortedKeySerializer));
759 *next_key = Some(key_str);
760 Ok(())
761 }
762 },
763
764 Compound::RawValue { .. } => unreachable!(),
765 }
766 }
767
768 #[inline]
769 fn serialize_value<T>(&mut self, value: &T) -> Result<()>
770 where
771 T: ?Sized + Serialize,
772 {
773 match self {
774 Compound::Map { ser, state } => match state {
775 MapState::Stream(_) => {
776 tri!(ser
777 .formatter
778 .begin_object_value(&mut ser.writer)
779 .map_err(Error::io));
780 tri!(value.serialize(&mut **ser));
781 ser.formatter
782 .end_object_value(&mut ser.writer)
783 .map_err(Error::io)
784 }
785
786 MapState::Sorted { entries, next_key } => {
787 let key = next_key
788 .take()
789 .expect("serialize_value called before serialize_key");
790 let mut entry_ser =
791 Serializer::with_formatter(Vec::with_capacity(128), ser.formatter.clone())
792 .with_cfg(ser.cfg);
793 tri!(value.serialize(&mut entry_ser));
794 let stored = entry_ser.into_inner();
795 entries.push((key, stored));
796 Ok(())
797 }
798 },
799
800 Compound::RawValue { .. } => unreachable!(),
801 }
802 }
803
804 #[inline]
805 fn end(self) -> Result<()> {
806 match self {
807 Compound::Map { ser, state } => match state {
808 MapState::Stream(map_state) => match map_state {
809 State::Empty => Ok(()),
810 _ => ser.formatter.end_object(&mut ser.writer).map_err(Error::io),
811 },
812
813 MapState::Sorted { entries, next_key } => {
814 debug_assert!(next_key.is_none());
815 write_sorted_entries(ser, entries)
816 }
817 },
818
819 Compound::RawValue { .. } => unreachable!(),
820 }
821 }
822}
823
824impl<'a, W, F> ser::SerializeStruct for Compound<'a, W, F>
825where
826 W: WriteExt,
827 F: Formatter,
828{
829 type Ok = ();
830 type Error = Error;
831
832 #[inline]
833 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<()>
834 where
835 T: ?Sized + Serialize,
836 {
837 match self {
838 Compound::Map { .. } => ser::SerializeMap::serialize_entry(self, key, value),
839
840 Compound::RawValue { ser, .. } => {
841 if key == crate::serde::rawnumber::TOKEN || key == crate::lazyvalue::TOKEN {
842 value.serialize(RawValueStrEmitter(ser))
843 } else {
844 Err(invalid_raw_value())
845 }
846 }
847 }
848 }
849
850 #[inline]
851 fn end(self) -> Result<()> {
852 match self {
853 Compound::Map { .. } => ser::SerializeMap::end(self),
854
855 Compound::RawValue { .. } => Ok(()),
856 }
857 }
858}
859
860impl<'a, W, F> ser::SerializeStructVariant for Compound<'a, W, F>
861where
862 W: WriteExt,
863 F: Formatter,
864{
865 type Ok = ();
866 type Error = Error;
867
868 #[inline]
869 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<()>
870 where
871 T: ?Sized + Serialize,
872 {
873 match *self {
874 Compound::Map { .. } => ser::SerializeStruct::serialize_field(self, key, value),
875
876 Compound::RawValue { .. } => unreachable!(),
877 }
878 }
879
880 #[inline]
881 fn end(self) -> Result<()> {
882 match self {
883 Compound::Map { ser, state } => match state {
884 MapState::Stream(map_state) => {
885 match map_state {
886 State::Empty => {}
887 _ => tri!(ser.formatter.end_object(&mut ser.writer).map_err(Error::io)),
888 }
889 tri!(ser
890 .formatter
891 .end_object_value(&mut ser.writer)
892 .map_err(Error::io));
893 ser.formatter.end_object(&mut ser.writer).map_err(Error::io)
894 }
895
896 MapState::Sorted { entries, next_key } => {
897 debug_assert!(next_key.is_none());
898 write_sorted_entries(ser, entries)
899 }
900 },
901
902 Compound::RawValue { .. } => unreachable!(),
903 }
904 }
905}
906
907struct MapKeySerializer<'a, W: 'a, F: 'a> {
908 ser: &'a mut Serializer<W, F>,
909}
910
911struct SortedKeySerializer;
912
913impl serde::Serializer for SortedKeySerializer {
914 type Ok = String;
915 type Error = Error;
916
917 type SerializeSeq = Impossible<String, Error>;
918 type SerializeTuple = Impossible<String, Error>;
919 type SerializeTupleStruct = Impossible<String, Error>;
920 type SerializeTupleVariant = Impossible<String, Error>;
921 type SerializeMap = Impossible<String, Error>;
922 type SerializeStruct = Impossible<String, Error>;
923 type SerializeStructVariant = Impossible<String, Error>;
924
925 #[inline]
926 fn serialize_bool(self, value: bool) -> Result<String> {
927 Ok(if value { "true" } else { "false" }.to_owned())
928 }
929
930 #[inline]
931 fn serialize_i8(self, value: i8) -> Result<String> {
932 self.serialize_i64(value as i64)
933 }
934
935 #[inline]
936 fn serialize_i16(self, value: i16) -> Result<String> {
937 self.serialize_i64(value as i64)
938 }
939
940 #[inline]
941 fn serialize_i32(self, value: i32) -> Result<String> {
942 self.serialize_i64(value as i64)
943 }
944
945 fn serialize_i64(self, value: i64) -> Result<String> {
946 let mut buf = itoa::Buffer::new();
947 Ok(buf.format(value).to_owned())
948 }
949
950 fn serialize_i128(self, value: i128) -> Result<String> {
951 Ok(value.to_string())
952 }
953
954 #[inline]
955 fn serialize_u8(self, value: u8) -> Result<String> {
956 self.serialize_u64(value as u64)
957 }
958
959 #[inline]
960 fn serialize_u16(self, value: u16) -> Result<String> {
961 self.serialize_u64(value as u64)
962 }
963
964 #[inline]
965 fn serialize_u32(self, value: u32) -> Result<String> {
966 self.serialize_u64(value as u64)
967 }
968
969 fn serialize_u64(self, value: u64) -> Result<String> {
970 let mut buf = itoa::Buffer::new();
971 Ok(buf.format(value).to_owned())
972 }
973
974 fn serialize_u128(self, value: u128) -> Result<String> {
975 Ok(value.to_string())
976 }
977
978 fn serialize_f32(self, value: f32) -> Result<String> {
979 if value.is_finite() {
980 let mut buf = zmij::Buffer::new();
981 Ok(buf.format_finite(value).to_owned())
982 } else {
983 Err(key_must_be_str_or_num(Unexpected::Other(
984 "NaN or Infinite f32",
985 )))
986 }
987 }
988
989 fn serialize_f64(self, value: f64) -> Result<String> {
990 if value.is_finite() {
991 let mut buf = zmij::Buffer::new();
992 Ok(buf.format_finite(value).to_owned())
993 } else {
994 Err(key_must_be_str_or_num(Unexpected::Other(
995 "NaN or Infinite f64",
996 )))
997 }
998 }
999
1000 #[inline]
1001 fn serialize_char(self, value: char) -> Result<String> {
1002 Ok(value.to_string())
1003 }
1004
1005 #[inline]
1006 fn serialize_str(self, value: &str) -> Result<String> {
1007 Ok(value.to_owned())
1008 }
1009
1010 fn serialize_bytes(self, _value: &[u8]) -> Result<String> {
1011 Err(key_must_be_str_or_num(Unexpected::Other("bytes")))
1012 }
1013
1014 fn serialize_unit(self) -> Result<String> {
1015 Err(key_must_be_str_or_num(Unexpected::Other("unit")))
1016 }
1017
1018 fn serialize_unit_struct(self, name: &'static str) -> Result<String> {
1019 Err(key_must_be_str_or_num(Unexpected::Other(name)))
1020 }
1021
1022 fn serialize_unit_variant(
1023 self,
1024 _name: &'static str,
1025 _variant_index: u32,
1026 variant: &'static str,
1027 ) -> Result<String> {
1028 Ok(variant.to_owned())
1029 }
1030
1031 fn serialize_newtype_variant<T>(
1032 self,
1033 _name: &'static str,
1034 _variant_index: u32,
1035 _variant: &'static str,
1036 _value: &T,
1037 ) -> Result<String>
1038 where
1039 T: ?Sized + Serialize,
1040 {
1041 Err(key_must_be_str_or_num(Unexpected::NewtypeVariant))
1042 }
1043
1044 fn serialize_none(self) -> Result<String> {
1045 Err(key_must_be_str_or_num(Unexpected::Other("none")))
1046 }
1047
1048 fn serialize_some<T>(self, value: &T) -> Result<String>
1049 where
1050 T: ?Sized + Serialize,
1051 {
1052 value.serialize(self)
1053 }
1054
1055 fn serialize_newtype_struct<T>(self, _name: &'static str, value: &T) -> Result<String>
1056 where
1057 T: ?Sized + Serialize,
1058 {
1059 value.serialize(self)
1060 }
1061
1062 fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq> {
1063 Err(key_must_be_str_or_num(Unexpected::Seq))
1064 }
1065
1066 fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple> {
1067 Err(key_must_be_str_or_num(Unexpected::Other("tuple")))
1068 }
1069
1070 fn serialize_tuple_struct(
1071 self,
1072 _name: &'static str,
1073 _len: usize,
1074 ) -> Result<Self::SerializeTupleStruct> {
1075 Err(key_must_be_str_or_num(Unexpected::Other("tuple_struct")))
1076 }
1077
1078 fn serialize_tuple_variant(
1079 self,
1080 _name: &'static str,
1081 _variant_index: u32,
1082 _variant: &'static str,
1083 _len: usize,
1084 ) -> Result<Self::SerializeTupleVariant> {
1085 Err(key_must_be_str_or_num(Unexpected::TupleVariant))
1086 }
1087
1088 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap> {
1089 Err(key_must_be_str_or_num(Unexpected::Map))
1090 }
1091
1092 fn serialize_struct(self, name: &'static str, _len: usize) -> Result<Self::SerializeStruct> {
1093 Err(key_must_be_str_or_num(Unexpected::Other(name)))
1094 }
1095
1096 fn serialize_struct_variant(
1097 self,
1098 _name: &'static str,
1099 _variant_index: u32,
1100 _variant: &'static str,
1101 _len: usize,
1102 ) -> Result<Self::SerializeStructVariant> {
1103 Err(key_must_be_str_or_num(Unexpected::StructVariant))
1104 }
1105
1106 fn collect_str<T>(self, value: &T) -> Result<String>
1107 where
1108 T: ?Sized + Display,
1109 {
1110 Ok(value.to_string())
1111 }
1112}
1113
1114fn invalid_raw_value() -> Error {
1116 Error::ser_error(ErrorCode::InvalidJsonValue)
1117}
1118
1119pub(crate) fn key_must_be_str_or_num(cur: Unexpected<'static>) -> Error {
1120 Error::ser_error(ErrorCode::SerExpectKeyIsStrOrNum(cur))
1121}
1122
1123macro_rules! quote {
1124 ($self:ident, $value:expr) => {{
1125 tri!($self
1126 .ser
1127 .formatter
1128 .begin_string(&mut $self.ser.writer)
1129 .map_err(Error::io));
1130 tri!($value.map_err(Error::io));
1131 return $self
1132 .ser
1133 .formatter
1134 .end_string(&mut $self.ser.writer)
1135 .map_err(Error::io);
1136 }};
1137}
1138
1139impl<'a, W, F> ser::Serializer for MapKeySerializer<'a, W, F>
1140where
1141 W: WriteExt,
1142 F: Formatter,
1143{
1144 type Ok = ();
1145 type Error = Error;
1146
1147 #[inline]
1148 fn serialize_str(self, value: &str) -> Result<()> {
1149 self.ser.serialize_str(value)
1150 }
1151
1152 #[inline]
1153 fn serialize_unit_variant(
1154 self,
1155 _name: &'static str,
1156 _variant_index: u32,
1157 variant: &'static str,
1158 ) -> Result<()> {
1159 self.ser.serialize_str(variant)
1160 }
1161
1162 #[inline]
1163 fn serialize_newtype_struct<T>(self, _name: &'static str, value: &T) -> Result<()>
1164 where
1165 T: ?Sized + Serialize,
1166 {
1167 value.serialize(self)
1168 }
1169
1170 type SerializeSeq = Impossible<(), Error>;
1171 type SerializeTuple = Impossible<(), Error>;
1172 type SerializeTupleStruct = Impossible<(), Error>;
1173 type SerializeTupleVariant = Impossible<(), Error>;
1174 type SerializeMap = Impossible<(), Error>;
1175 type SerializeStruct = Compound<'a, W, F>;
1176 type SerializeStructVariant = Impossible<(), Error>;
1177
1178 fn serialize_bool(self, value: bool) -> Result<()> {
1179 quote!(
1180 self,
1181 self.ser.formatter.write_bool(&mut self.ser.writer, value)
1182 );
1183 }
1184
1185 fn serialize_i8(self, value: i8) -> Result<()> {
1186 quote!(
1187 self,
1188 self.ser.formatter.write_i8(&mut self.ser.writer, value)
1189 );
1190 }
1191
1192 fn serialize_i16(self, value: i16) -> Result<()> {
1193 quote!(
1194 self,
1195 self.ser.formatter.write_i16(&mut self.ser.writer, value)
1196 );
1197 }
1198
1199 fn serialize_i32(self, value: i32) -> Result<()> {
1200 quote!(
1201 self,
1202 self.ser.formatter.write_i32(&mut self.ser.writer, value)
1203 );
1204 }
1205
1206 fn serialize_i64(self, value: i64) -> Result<()> {
1207 quote!(
1208 self,
1209 self.ser.formatter.write_i64(&mut self.ser.writer, value)
1210 );
1211 }
1212
1213 fn serialize_i128(self, value: i128) -> Result<()> {
1214 quote!(
1215 self,
1216 self.ser.formatter.write_i128(&mut self.ser.writer, value)
1217 );
1218 }
1219
1220 fn serialize_u8(self, value: u8) -> Result<()> {
1221 quote!(
1222 self,
1223 self.ser.formatter.write_u8(&mut self.ser.writer, value)
1224 );
1225 }
1226
1227 fn serialize_u16(self, value: u16) -> Result<()> {
1228 quote!(
1229 self,
1230 self.ser.formatter.write_u16(&mut self.ser.writer, value)
1231 );
1232 }
1233
1234 fn serialize_u32(self, value: u32) -> Result<()> {
1235 quote!(
1236 self,
1237 self.ser.formatter.write_u32(&mut self.ser.writer, value)
1238 );
1239 }
1240
1241 fn serialize_u64(self, value: u64) -> Result<()> {
1242 quote!(
1243 self,
1244 self.ser.formatter.write_u64(&mut self.ser.writer, value)
1245 );
1246 }
1247
1248 fn serialize_u128(self, value: u128) -> Result<()> {
1249 quote!(
1250 self,
1251 self.ser.formatter.write_u128(&mut self.ser.writer, value)
1252 );
1253 }
1254
1255 fn serialize_f32(self, value: f32) -> Result<()> {
1256 if value.is_finite() {
1257 quote!(
1258 self,
1259 self.ser.formatter.write_f32(&mut self.ser.writer, value)
1260 )
1261 } else {
1262 Err(key_must_be_str_or_num(Unexpected::Other(
1263 "NaN or Infinite f32",
1264 )))
1265 }
1266 }
1267
1268 fn serialize_f64(self, value: f64) -> Result<()> {
1269 if value.is_finite() {
1270 quote!(
1271 self,
1272 self.ser.formatter.write_f64(&mut self.ser.writer, value)
1273 );
1274 } else {
1275 Err(key_must_be_str_or_num(Unexpected::Other(
1276 "NaN or Infinite f64",
1277 )))
1278 }
1279 }
1280
1281 fn serialize_char(self, value: char) -> Result<()> {
1282 self.ser.serialize_str(&value.to_string())
1283 }
1284
1285 fn serialize_bytes(self, _value: &[u8]) -> Result<()> {
1286 Err(key_must_be_str_or_num(Unexpected::Other("bytes")))
1287 }
1288
1289 fn serialize_unit(self) -> Result<()> {
1290 Err(key_must_be_str_or_num(Unexpected::Other("uint")))
1291 }
1292
1293 fn serialize_unit_struct(self, name: &'static str) -> Result<()> {
1294 Err(key_must_be_str_or_num(Unexpected::Other(name)))
1295 }
1296
1297 fn serialize_newtype_variant<T>(
1298 self,
1299 _name: &'static str,
1300 _variant_index: u32,
1301 _variant: &'static str,
1302 _value: &T,
1303 ) -> Result<()>
1304 where
1305 T: ?Sized + Serialize,
1306 {
1307 Err(key_must_be_str_or_num(Unexpected::NewtypeVariant))
1308 }
1309
1310 fn serialize_none(self) -> Result<()> {
1311 Err(key_must_be_str_or_num(Unexpected::Other("none")))
1312 }
1313
1314 fn serialize_some<T>(self, value: &T) -> Result<()>
1315 where
1316 T: ?Sized + Serialize,
1317 {
1318 value.serialize(self)
1319 }
1320
1321 fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq> {
1322 Err(key_must_be_str_or_num(Unexpected::Seq))
1323 }
1324
1325 fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple> {
1326 Err(key_must_be_str_or_num(Unexpected::Other("tuple")))
1327 }
1328
1329 fn serialize_tuple_struct(
1330 self,
1331 _name: &'static str,
1332 _len: usize,
1333 ) -> Result<Self::SerializeTupleStruct> {
1334 Err(key_must_be_str_or_num(Unexpected::Other("tuple_struct")))
1335 }
1336
1337 fn serialize_tuple_variant(
1338 self,
1339 _name: &'static str,
1340 _variant_index: u32,
1341 _variant: &'static str,
1342 _len: usize,
1343 ) -> Result<Self::SerializeTupleVariant> {
1344 Err(key_must_be_str_or_num(Unexpected::TupleVariant))
1345 }
1346
1347 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap> {
1348 Err(key_must_be_str_or_num(Unexpected::Map))
1349 }
1350
1351 fn serialize_struct(self, name: &'static str, _len: usize) -> Result<Self::SerializeStruct> {
1352 Err(key_must_be_str_or_num(Unexpected::Other(name)))
1353 }
1354
1355 fn serialize_struct_variant(
1356 self,
1357 _name: &'static str,
1358 _variant_index: u32,
1359 _variant: &'static str,
1360 _len: usize,
1361 ) -> Result<Self::SerializeStructVariant> {
1362 Err(key_must_be_str_or_num(Unexpected::StructVariant))
1363 }
1364
1365 fn collect_str<T>(self, value: &T) -> Result<()>
1366 where
1367 T: ?Sized + Display,
1368 {
1369 self.ser.collect_str(value)
1370 }
1371}
1372
1373struct RawValueStrEmitter<'a, W: 'a + WriteExt, F: 'a + Formatter>(&'a mut Serializer<W, F>);
1374
1375impl<'a, W: WriteExt, F: Formatter> ser::Serializer for RawValueStrEmitter<'a, W, F> {
1376 type Ok = ();
1377 type Error = Error;
1378
1379 type SerializeSeq = Impossible<(), Error>;
1380 type SerializeTuple = Impossible<(), Error>;
1381 type SerializeTupleStruct = Impossible<(), Error>;
1382 type SerializeTupleVariant = Impossible<(), Error>;
1383 type SerializeMap = Impossible<(), Error>;
1384 type SerializeStruct = Impossible<(), Error>;
1385 type SerializeStructVariant = Impossible<(), Error>;
1386
1387 fn serialize_bool(self, _v: bool) -> Result<()> {
1388 Err(ser::Error::custom("expected RawValue"))
1389 }
1390
1391 fn serialize_i8(self, _v: i8) -> Result<()> {
1392 Err(ser::Error::custom("expected RawValue"))
1393 }
1394
1395 fn serialize_i16(self, _v: i16) -> Result<()> {
1396 Err(ser::Error::custom("expected RawValue"))
1397 }
1398
1399 fn serialize_i32(self, _v: i32) -> Result<()> {
1400 Err(ser::Error::custom("expected RawValue"))
1401 }
1402
1403 fn serialize_i64(self, _v: i64) -> Result<()> {
1404 Err(ser::Error::custom("expected RawValue"))
1405 }
1406
1407 fn serialize_i128(self, _v: i128) -> Result<()> {
1408 Err(ser::Error::custom("expected RawValue"))
1409 }
1410
1411 fn serialize_u8(self, _v: u8) -> Result<()> {
1412 Err(ser::Error::custom("expected RawValue"))
1413 }
1414
1415 fn serialize_u16(self, _v: u16) -> Result<()> {
1416 Err(ser::Error::custom("expected RawValue"))
1417 }
1418
1419 fn serialize_u32(self, _v: u32) -> Result<()> {
1420 Err(ser::Error::custom("expected RawValue"))
1421 }
1422
1423 fn serialize_u64(self, _v: u64) -> Result<()> {
1424 Err(ser::Error::custom("expected RawValue"))
1425 }
1426
1427 fn serialize_u128(self, _v: u128) -> Result<()> {
1428 Err(ser::Error::custom("expected RawValue"))
1429 }
1430
1431 fn serialize_f32(self, _v: f32) -> Result<()> {
1432 Err(ser::Error::custom("expected RawValue"))
1433 }
1434
1435 fn serialize_f64(self, _v: f64) -> Result<()> {
1436 Err(ser::Error::custom("expected RawValue"))
1437 }
1438
1439 fn serialize_char(self, _v: char) -> Result<()> {
1440 Err(ser::Error::custom("expected RawValue"))
1441 }
1442
1443 fn serialize_str(self, value: &str) -> Result<()> {
1444 let RawValueStrEmitter(serializer) = self;
1445 serializer
1446 .formatter
1447 .write_raw_value(&mut serializer.writer, value)
1448 .map_err(Error::io)
1449 }
1450
1451 fn serialize_bytes(self, _value: &[u8]) -> Result<()> {
1452 Err(ser::Error::custom("expected RawValue"))
1453 }
1454
1455 fn serialize_none(self) -> Result<()> {
1456 Err(ser::Error::custom("expected RawValue"))
1457 }
1458
1459 fn serialize_some<T>(self, _value: &T) -> Result<()>
1460 where
1461 T: ?Sized + Serialize,
1462 {
1463 Err(ser::Error::custom("expected RawValue"))
1464 }
1465
1466 fn serialize_unit(self) -> Result<()> {
1467 Err(ser::Error::custom("expected RawValue"))
1468 }
1469
1470 fn serialize_unit_struct(self, _name: &'static str) -> Result<()> {
1471 Err(ser::Error::custom("expected RawValue"))
1472 }
1473
1474 fn serialize_unit_variant(
1475 self,
1476 _name: &'static str,
1477 _variant_index: u32,
1478 _variant: &'static str,
1479 ) -> Result<()> {
1480 Err(ser::Error::custom("expected RawValue"))
1481 }
1482
1483 fn serialize_newtype_struct<T>(self, _name: &'static str, _value: &T) -> Result<()>
1484 where
1485 T: ?Sized + Serialize,
1486 {
1487 Err(ser::Error::custom("expected RawValue"))
1488 }
1489
1490 fn serialize_newtype_variant<T>(
1491 self,
1492 _name: &'static str,
1493 _variant_index: u32,
1494 _variant: &'static str,
1495 _value: &T,
1496 ) -> Result<()>
1497 where
1498 T: ?Sized + Serialize,
1499 {
1500 Err(ser::Error::custom("expected RawValue"))
1501 }
1502
1503 fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq> {
1504 Err(ser::Error::custom("expected RawValue"))
1505 }
1506
1507 fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple> {
1508 Err(ser::Error::custom("expected RawValue"))
1509 }
1510
1511 fn serialize_tuple_struct(
1512 self,
1513 _name: &'static str,
1514 _len: usize,
1515 ) -> Result<Self::SerializeTupleStruct> {
1516 Err(ser::Error::custom("expected RawValue"))
1517 }
1518
1519 fn serialize_tuple_variant(
1520 self,
1521 _name: &'static str,
1522 _variant_index: u32,
1523 _variant: &'static str,
1524 _len: usize,
1525 ) -> Result<Self::SerializeTupleVariant> {
1526 Err(ser::Error::custom("expected RawValue"))
1527 }
1528
1529 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap> {
1530 Err(ser::Error::custom("expected RawValue"))
1531 }
1532
1533 fn serialize_struct(self, _name: &'static str, _len: usize) -> Result<Self::SerializeStruct> {
1534 Err(ser::Error::custom("expected RawValue"))
1535 }
1536
1537 fn serialize_struct_variant(
1538 self,
1539 _name: &'static str,
1540 _variant_index: u32,
1541 _variant: &'static str,
1542 _len: usize,
1543 ) -> Result<Self::SerializeStructVariant> {
1544 Err(ser::Error::custom("expected RawValue"))
1545 }
1546
1547 fn collect_str<T>(self, value: &T) -> Result<Self::Ok>
1548 where
1549 T: ?Sized + Display,
1550 {
1551 self.serialize_str(&value.to_string())
1552 }
1553}
1554
1555#[inline]
1564pub fn to_writer<W, T>(writer: W, value: &T) -> Result<()>
1565where
1566 W: WriteExt,
1567 T: ?Sized + Serialize,
1568{
1569 let mut ser = Serializer::new(writer);
1570 value.serialize(&mut ser)
1571}
1572
1573#[inline]
1583pub fn to_writer_pretty<W, T>(writer: W, value: &T) -> Result<()>
1584where
1585 W: WriteExt,
1586 T: ?Sized + Serialize,
1587{
1588 let mut ser = Serializer::with_formatter(writer, PrettyFormatter::new());
1589 value.serialize(&mut ser)
1590}
1591
1592#[inline]
1599pub fn to_vec<T>(value: &T) -> Result<Vec<u8>>
1600where
1601 T: ?Sized + Serialize,
1602{
1603 let mut writer = Vec::with_capacity(128);
1604 tri!(to_writer(&mut writer, value));
1605 Ok(writer)
1606}
1607
1608#[inline]
1615pub fn to_vec_pretty<T>(value: &T) -> Result<Vec<u8>>
1616where
1617 T: ?Sized + Serialize,
1618{
1619 let mut writer = Vec::with_capacity(128);
1620 tri!(to_writer_pretty(&mut writer, value));
1621 Ok(writer)
1622}
1623
1624#[inline]
1631pub fn to_string<T>(value: &T) -> Result<String>
1632where
1633 T: ?Sized + Serialize,
1634{
1635 let vec = tri!(to_vec(value));
1636 let string = unsafe {
1637 String::from_utf8_unchecked(vec)
1639 };
1640 Ok(string)
1641}
1642
1643#[inline]
1645pub fn to_lazyvalue<T>(value: &T) -> Result<OwnedLazyValue>
1646where
1647 T: ?Sized + Serialize,
1648{
1649 let vec = tri!(to_vec(value));
1650 let string = unsafe {
1651 String::from_utf8_unchecked(vec)
1653 };
1654
1655 Ok(OwnedLazyValue::new(
1656 FastStr::new(string).into(),
1657 HasEsc::Possible,
1658 ))
1659}
1660
1661#[inline]
1668pub fn to_string_pretty<T>(value: &T) -> Result<String>
1669where
1670 T: ?Sized + Serialize,
1671{
1672 let vec = tri!(to_vec_pretty(value));
1673 let string = unsafe {
1674 String::from_utf8_unchecked(vec)
1676 };
1677 Ok(string)
1678}
1679
1680#[cfg(test)]
1681mod test {
1682 use std::io;
1683
1684 use crate::{json, writer::BufferedWriter};
1685
1686 #[test]
1687 fn behaves_equal() {
1688 let object = json!({
1689 "hello": "world",
1690 "this_is_considered": "fast"
1691 });
1692
1693 let mut cursor: io::Cursor<Vec<u8>> = io::Cursor::new(Vec::new());
1694 let writer = BufferedWriter::new(&mut cursor);
1695 crate::to_writer(writer, &object).unwrap();
1696
1697 let vec = crate::to_vec(&object).unwrap();
1698
1699 assert_eq!(vec, cursor.into_inner());
1700 }
1701}