1use serde::{ser::Impossible, Serialize};
2use smallstr::SmallString;
3use std::fmt;
4
5use super::NUMBER_TOKEN;
6use crate::{object::Key, Array, NumberBuf, Object, Value};
7
8impl Serialize for Value {
9 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
10 where
11 S: serde::Serializer,
12 {
13 match self {
14 Self::Null => serializer.serialize_unit(),
15 Self::Boolean(b) => serializer.serialize_bool(*b),
16 Self::Number(n) => n.serialize(serializer),
17 Self::String(s) => serializer.serialize_str(s),
18 Self::Array(a) => {
19 use serde::ser::SerializeSeq;
20 let mut seq = serializer.serialize_seq(Some(a.len()))?;
21
22 for item in a {
23 seq.serialize_element(item)?
24 }
25
26 seq.end()
27 }
28 Self::Object(o) => o.serialize(serializer),
29 }
30 }
31}
32
33impl Serialize for Object {
34 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
35 where
36 S: serde::Serializer,
37 {
38 use serde::ser::SerializeMap;
39 let mut map = serializer.serialize_map(Some(self.len()))?;
40
41 for entry in self {
42 map.serialize_entry(entry.key.as_str(), &entry.value)?;
43 }
44
45 map.end()
46 }
47}
48
49#[derive(Debug, Clone)]
50pub enum SerializeError {
51 Custom(String),
52 NonStringKey,
53 MalformedHighPrecisionNumber,
54}
55
56impl fmt::Display for SerializeError {
57 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
58 match self {
59 Self::Custom(msg) => msg.fmt(f),
60 Self::NonStringKey => write!(f, "key must be a string"),
61 Self::MalformedHighPrecisionNumber => write!(f, "malformed high-precision number"),
62 }
63 }
64}
65
66impl std::error::Error for SerializeError {}
67
68impl serde::ser::Error for SerializeError {
69 fn custom<T>(msg: T) -> Self
70 where
71 T: fmt::Display,
72 {
73 Self::Custom(msg.to_string())
74 }
75}
76
77pub struct Serializer;
79
80impl serde::Serializer for Serializer {
81 type Ok = Value;
82 type Error = SerializeError;
83
84 type SerializeSeq = SerializeArray;
85 type SerializeTuple = SerializeArray;
86 type SerializeTupleStruct = SerializeArray;
87 type SerializeTupleVariant = SerializeTupleVariant;
88 type SerializeMap = SerializeMap;
89 type SerializeStruct = SerializeMap;
90 type SerializeStructVariant = SerializeStructVariant;
91
92 #[inline(always)]
93 fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
94 Ok(Value::Boolean(v))
95 }
96
97 #[inline(always)]
98 fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
99 self.serialize_i64(v as i64)
100 }
101
102 #[inline(always)]
103 fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
104 self.serialize_i64(v as i64)
105 }
106
107 #[inline(always)]
108 fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
109 self.serialize_i64(v as i64)
110 }
111
112 #[inline(always)]
113 fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
114 Ok(Value::Number(v.into()))
115 }
116
117 #[inline(always)]
118 fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
119 self.serialize_u64(v as u64)
120 }
121
122 #[inline(always)]
123 fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
124 self.serialize_u64(v as u64)
125 }
126
127 #[inline(always)]
128 fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
129 self.serialize_u64(v as u64)
130 }
131
132 #[inline(always)]
133 fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
134 Ok(Value::Number(v.into()))
135 }
136
137 #[inline(always)]
138 fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
139 Ok(NumberBuf::try_from(v)
140 .map(Value::Number)
141 .unwrap_or(Value::Null))
142 }
143
144 #[inline(always)]
145 fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
146 Ok(NumberBuf::try_from(v)
147 .map(Value::Number)
148 .unwrap_or(Value::Null))
149 }
150
151 #[inline(always)]
152 fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
153 let mut s = SmallString::new();
154 s.push(v);
155 Ok(Value::String(s))
156 }
157
158 #[inline(always)]
159 fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
160 Ok(Value::String(v.into()))
161 }
162
163 #[inline(always)]
164 fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
165 let vec = v.iter().map(|&b| Value::Number(b.into())).collect();
166 Ok(Value::Array(vec))
167 }
168
169 #[inline(always)]
170 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
171 Ok(Value::Null)
172 }
173
174 #[inline(always)]
175 fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> {
176 self.serialize_unit()
177 }
178
179 #[inline(always)]
180 fn serialize_unit_variant(
181 self,
182 _name: &'static str,
183 _variant_index: u32,
184 variant: &'static str,
185 ) -> Result<Self::Ok, Self::Error> {
186 self.serialize_str(variant)
187 }
188
189 #[inline(always)]
190 fn serialize_newtype_struct<T>(
191 self,
192 _name: &'static str,
193 value: &T,
194 ) -> Result<Self::Ok, Self::Error>
195 where
196 T: ?Sized + Serialize,
197 {
198 value.serialize(self)
199 }
200
201 #[inline(always)]
202 fn serialize_newtype_variant<T>(
203 self,
204 _name: &'static str,
205 _variant_index: u32,
206 variant: &'static str,
207 value: &T,
208 ) -> Result<Self::Ok, Self::Error>
209 where
210 T: ?Sized + Serialize,
211 {
212 let mut obj = Object::new();
213 obj.insert(variant.into(), value.serialize(self)?);
214 Ok(Value::Object(obj))
215 }
216
217 #[inline(always)]
218 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
219 self.serialize_unit()
220 }
221
222 #[inline(always)]
223 fn serialize_some<T>(self, value: &T) -> Result<Self::Ok, Self::Error>
224 where
225 T: ?Sized + Serialize,
226 {
227 value.serialize(self)
228 }
229
230 #[inline(always)]
231 fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
232 Ok(SerializeArray {
233 array: Vec::with_capacity(len.unwrap_or(0)),
234 })
235 }
236
237 #[inline(always)]
238 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error> {
239 self.serialize_seq(Some(len))
240 }
241
242 #[inline(always)]
243 fn serialize_tuple_struct(
244 self,
245 _name: &'static str,
246 len: usize,
247 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
248 self.serialize_seq(Some(len))
249 }
250
251 fn serialize_tuple_variant(
252 self,
253 _name: &'static str,
254 _variant_index: u32,
255 variant: &'static str,
256 len: usize,
257 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
258 Ok(SerializeTupleVariant {
259 name: variant.into(),
260 array: Vec::with_capacity(len),
261 })
262 }
263
264 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
265 Ok(SerializeMap::Object {
266 obj: Object::new(),
267 next_key: None,
268 })
269 }
270
271 fn serialize_struct(
272 self,
273 _name: &'static str,
274 len: usize,
275 ) -> Result<Self::SerializeStruct, Self::Error> {
276 self.serialize_map(Some(len))
277 }
278
279 fn serialize_struct_variant(
280 self,
281 _name: &'static str,
282 _variant_index: u32,
283 variant: &'static str,
284 _len: usize,
285 ) -> Result<Self::SerializeStructVariant, Self::Error> {
286 Ok(SerializeStructVariant {
287 name: variant.into(),
288 obj: Object::new(),
289 })
290 }
291
292 fn collect_str<T>(self, value: &T) -> Result<Self::Ok, Self::Error>
293 where
294 T: ?Sized + fmt::Display,
295 {
296 Ok(Value::String(value.to_string().into()))
297 }
298}
299
300pub struct StringNumberSerializer;
301
302impl serde::Serializer for StringNumberSerializer {
303 type Ok = NumberBuf;
304 type Error = SerializeError;
305
306 type SerializeSeq = serde::ser::Impossible<Self::Ok, Self::Error>;
307 type SerializeTuple = serde::ser::Impossible<Self::Ok, Self::Error>;
308 type SerializeTupleStruct = serde::ser::Impossible<Self::Ok, Self::Error>;
309 type SerializeTupleVariant = serde::ser::Impossible<Self::Ok, Self::Error>;
310 type SerializeMap = serde::ser::Impossible<Self::Ok, Self::Error>;
311 type SerializeStruct = serde::ser::Impossible<Self::Ok, Self::Error>;
312 type SerializeStructVariant = serde::ser::Impossible<Self::Ok, Self::Error>;
313
314 fn serialize_bool(self, _v: bool) -> Result<Self::Ok, Self::Error> {
315 Err(SerializeError::MalformedHighPrecisionNumber)
316 }
317
318 fn serialize_i8(self, _v: i8) -> Result<Self::Ok, Self::Error> {
319 Err(SerializeError::MalformedHighPrecisionNumber)
320 }
321
322 fn serialize_i16(self, _v: i16) -> Result<Self::Ok, Self::Error> {
323 Err(SerializeError::MalformedHighPrecisionNumber)
324 }
325
326 fn serialize_i32(self, _v: i32) -> Result<Self::Ok, Self::Error> {
327 Err(SerializeError::MalformedHighPrecisionNumber)
328 }
329
330 fn serialize_i64(self, _v: i64) -> Result<Self::Ok, Self::Error> {
331 Err(SerializeError::MalformedHighPrecisionNumber)
332 }
333
334 fn serialize_u8(self, _v: u8) -> Result<Self::Ok, Self::Error> {
335 Err(SerializeError::MalformedHighPrecisionNumber)
336 }
337
338 fn serialize_u16(self, _v: u16) -> Result<Self::Ok, Self::Error> {
339 Err(SerializeError::MalformedHighPrecisionNumber)
340 }
341
342 fn serialize_u32(self, _v: u32) -> Result<Self::Ok, Self::Error> {
343 Err(SerializeError::MalformedHighPrecisionNumber)
344 }
345
346 fn serialize_u64(self, _v: u64) -> Result<Self::Ok, Self::Error> {
347 Err(SerializeError::MalformedHighPrecisionNumber)
348 }
349
350 fn serialize_f32(self, _v: f32) -> Result<Self::Ok, Self::Error> {
351 Err(SerializeError::MalformedHighPrecisionNumber)
352 }
353
354 fn serialize_f64(self, _v: f64) -> Result<Self::Ok, Self::Error> {
355 Err(SerializeError::MalformedHighPrecisionNumber)
356 }
357
358 fn serialize_char(self, _v: char) -> Result<Self::Ok, Self::Error> {
359 Err(SerializeError::MalformedHighPrecisionNumber)
360 }
361
362 fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
363 NumberBuf::new(v.as_bytes().into())
364 .map_err(|_| SerializeError::MalformedHighPrecisionNumber)
365 }
366
367 fn serialize_bytes(self, _v: &[u8]) -> Result<Self::Ok, Self::Error> {
368 Err(SerializeError::MalformedHighPrecisionNumber)
369 }
370
371 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
372 Err(SerializeError::MalformedHighPrecisionNumber)
373 }
374
375 fn serialize_some<T>(self, _value: &T) -> Result<Self::Ok, Self::Error>
376 where
377 T: ?Sized + Serialize,
378 {
379 Err(SerializeError::MalformedHighPrecisionNumber)
380 }
381
382 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
383 Err(SerializeError::MalformedHighPrecisionNumber)
384 }
385
386 fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> {
387 Err(SerializeError::MalformedHighPrecisionNumber)
388 }
389
390 fn serialize_unit_variant(
391 self,
392 _name: &'static str,
393 _variant_index: u32,
394 _variant: &'static str,
395 ) -> Result<Self::Ok, Self::Error> {
396 Err(SerializeError::MalformedHighPrecisionNumber)
397 }
398
399 fn serialize_newtype_struct<T>(
400 self,
401 _name: &'static str,
402 _value: &T,
403 ) -> Result<Self::Ok, Self::Error>
404 where
405 T: ?Sized + Serialize,
406 {
407 Err(SerializeError::MalformedHighPrecisionNumber)
408 }
409
410 fn serialize_newtype_variant<T>(
411 self,
412 _name: &'static str,
413 _variant_index: u32,
414 _variant: &'static str,
415 _value: &T,
416 ) -> Result<Self::Ok, Self::Error>
417 where
418 T: ?Sized + Serialize,
419 {
420 Err(SerializeError::MalformedHighPrecisionNumber)
421 }
422
423 fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
424 Err(SerializeError::MalformedHighPrecisionNumber)
425 }
426
427 fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, Self::Error> {
428 Err(SerializeError::MalformedHighPrecisionNumber)
429 }
430
431 fn serialize_tuple_struct(
432 self,
433 _name: &'static str,
434 _len: usize,
435 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
436 Err(SerializeError::MalformedHighPrecisionNumber)
437 }
438
439 fn serialize_tuple_variant(
440 self,
441 _name: &'static str,
442 _variant_index: u32,
443 _variant: &'static str,
444 _len: usize,
445 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
446 Err(SerializeError::MalformedHighPrecisionNumber)
447 }
448
449 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
450 Err(SerializeError::MalformedHighPrecisionNumber)
451 }
452
453 fn serialize_struct(
454 self,
455 _name: &'static str,
456 _len: usize,
457 ) -> Result<Self::SerializeStruct, Self::Error> {
458 Err(SerializeError::MalformedHighPrecisionNumber)
459 }
460
461 fn serialize_struct_variant(
462 self,
463 _name: &'static str,
464 _variant_index: u32,
465 _variant: &'static str,
466 _len: usize,
467 ) -> Result<Self::SerializeStructVariant, Self::Error> {
468 Err(SerializeError::MalformedHighPrecisionNumber)
469 }
470}
471
472pub struct KeySerializer;
473
474impl serde::Serializer for KeySerializer {
475 type Ok = Key;
476 type Error = SerializeError;
477
478 type SerializeSeq = Impossible<Key, SerializeError>;
479 type SerializeTuple = Impossible<Key, SerializeError>;
480 type SerializeTupleStruct = Impossible<Key, SerializeError>;
481 type SerializeTupleVariant = Impossible<Key, SerializeError>;
482 type SerializeMap = Impossible<Key, SerializeError>;
483 type SerializeStruct = Impossible<Key, SerializeError>;
484 type SerializeStructVariant = Impossible<Key, SerializeError>;
485
486 #[inline]
487 fn serialize_unit_variant(
488 self,
489 _name: &'static str,
490 _variant_index: u32,
491 variant: &'static str,
492 ) -> Result<Self::Ok, Self::Error> {
493 Ok(variant.into())
494 }
495
496 #[inline]
497 fn serialize_newtype_struct<T>(
498 self,
499 _name: &'static str,
500 value: &T,
501 ) -> Result<Self::Ok, Self::Error>
502 where
503 T: ?Sized + Serialize,
504 {
505 value.serialize(self)
506 }
507
508 fn serialize_bool(self, _value: bool) -> Result<Self::Ok, Self::Error> {
509 Err(SerializeError::NonStringKey)
510 }
511
512 fn serialize_i8(self, value: i8) -> Result<Self::Ok, Self::Error> {
513 Ok(value.to_string().into())
514 }
515
516 fn serialize_i16(self, value: i16) -> Result<Self::Ok, Self::Error> {
517 Ok(value.to_string().into())
518 }
519
520 fn serialize_i32(self, value: i32) -> Result<Self::Ok, Self::Error> {
521 Ok(value.to_string().into())
522 }
523
524 fn serialize_i64(self, value: i64) -> Result<Self::Ok, Self::Error> {
525 Ok(value.to_string().into())
526 }
527
528 fn serialize_u8(self, value: u8) -> Result<Self::Ok, Self::Error> {
529 Ok(value.to_string().into())
530 }
531
532 fn serialize_u16(self, value: u16) -> Result<Self::Ok, Self::Error> {
533 Ok(value.to_string().into())
534 }
535
536 fn serialize_u32(self, value: u32) -> Result<Self::Ok, Self::Error> {
537 Ok(value.to_string().into())
538 }
539
540 fn serialize_u64(self, value: u64) -> Result<Self::Ok, Self::Error> {
541 Ok(value.to_string().into())
542 }
543
544 fn serialize_f32(self, _value: f32) -> Result<Self::Ok, Self::Error> {
545 Err(SerializeError::NonStringKey)
546 }
547
548 fn serialize_f64(self, _value: f64) -> Result<Self::Ok, Self::Error> {
549 Err(SerializeError::NonStringKey)
550 }
551
552 #[inline]
553 fn serialize_char(self, value: char) -> Result<Self::Ok, Self::Error> {
554 let mut s = Key::new();
555 s.push(value);
556 Ok(s)
557 }
558
559 #[inline]
560 fn serialize_str(self, value: &str) -> Result<Self::Ok, Self::Error> {
561 Ok(value.into())
562 }
563
564 fn serialize_bytes(self, _value: &[u8]) -> Result<Self::Ok, Self::Error> {
565 Err(SerializeError::NonStringKey)
566 }
567
568 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
569 Err(SerializeError::NonStringKey)
570 }
571
572 fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> {
573 Err(SerializeError::NonStringKey)
574 }
575
576 fn serialize_newtype_variant<T>(
577 self,
578 _name: &'static str,
579 _variant_index: u32,
580 _variant: &'static str,
581 _value: &T,
582 ) -> Result<Self::Ok, Self::Error>
583 where
584 T: ?Sized + Serialize,
585 {
586 Err(SerializeError::NonStringKey)
587 }
588
589 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
590 Err(SerializeError::NonStringKey)
591 }
592
593 fn serialize_some<T>(self, _value: &T) -> Result<Self::Ok, Self::Error>
594 where
595 T: ?Sized + Serialize,
596 {
597 Err(SerializeError::NonStringKey)
598 }
599
600 fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
601 Err(SerializeError::NonStringKey)
602 }
603
604 fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, Self::Error> {
605 Err(SerializeError::NonStringKey)
606 }
607
608 fn serialize_tuple_struct(
609 self,
610 _name: &'static str,
611 _len: usize,
612 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
613 Err(SerializeError::NonStringKey)
614 }
615
616 fn serialize_tuple_variant(
617 self,
618 _name: &'static str,
619 _variant_index: u32,
620 _variant: &'static str,
621 _len: usize,
622 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
623 Err(SerializeError::NonStringKey)
624 }
625
626 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
627 Err(SerializeError::NonStringKey)
628 }
629
630 fn serialize_struct(
631 self,
632 _name: &'static str,
633 _len: usize,
634 ) -> Result<Self::SerializeStruct, Self::Error> {
635 Err(SerializeError::NonStringKey)
636 }
637
638 fn serialize_struct_variant(
639 self,
640 _name: &'static str,
641 _variant_index: u32,
642 _variant: &'static str,
643 _len: usize,
644 ) -> Result<Self::SerializeStructVariant, Self::Error> {
645 Err(SerializeError::NonStringKey)
646 }
647
648 fn collect_str<T>(self, value: &T) -> Result<Self::Ok, Self::Error>
649 where
650 T: ?Sized + fmt::Display,
651 {
652 Ok(value.to_string().into())
653 }
654}
655
656pub struct SerializeArray {
657 array: Array,
658}
659
660impl serde::ser::SerializeSeq for SerializeArray {
661 type Ok = Value;
662 type Error = SerializeError;
663
664 fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>
665 where
666 T: ?Sized + Serialize,
667 {
668 self.array.push(value.serialize(Serializer)?);
669 Ok(())
670 }
671
672 fn end(self) -> Result<Self::Ok, Self::Error> {
673 Ok(Value::Array(self.array))
674 }
675}
676
677impl serde::ser::SerializeTuple for SerializeArray {
678 type Ok = Value;
679 type Error = SerializeError;
680
681 fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>
682 where
683 T: ?Sized + Serialize,
684 {
685 serde::ser::SerializeSeq::serialize_element(self, value)
686 }
687
688 fn end(self) -> Result<Self::Ok, Self::Error> {
689 serde::ser::SerializeSeq::end(self)
690 }
691}
692
693impl serde::ser::SerializeTupleStruct for SerializeArray {
694 type Ok = Value;
695 type Error = SerializeError;
696
697 fn serialize_field<T>(&mut self, value: &T) -> Result<(), Self::Error>
698 where
699 T: ?Sized + Serialize,
700 {
701 serde::ser::SerializeSeq::serialize_element(self, value)
702 }
703
704 fn end(self) -> Result<Self::Ok, Self::Error> {
705 serde::ser::SerializeSeq::end(self)
706 }
707}
708
709pub struct SerializeTupleVariant {
710 name: Key,
711 array: Array,
712}
713
714impl serde::ser::SerializeTupleVariant for SerializeTupleVariant {
715 type Ok = Value;
716 type Error = SerializeError;
717
718 fn serialize_field<T>(&mut self, value: &T) -> Result<(), Self::Error>
719 where
720 T: ?Sized + Serialize,
721 {
722 self.array.push(value.serialize(Serializer)?);
723 Ok(())
724 }
725
726 fn end(self) -> Result<Self::Ok, Self::Error> {
727 let mut obj = Object::new();
728 obj.insert(self.name, Value::Array(self.array));
729
730 Ok(Value::Object(obj))
731 }
732}
733
734pub struct SerializeStructVariant {
735 name: Key,
736 obj: Object,
737}
738
739impl serde::ser::SerializeStructVariant for SerializeStructVariant {
740 type Ok = Value;
741 type Error = SerializeError;
742
743 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>
744 where
745 T: ?Sized + Serialize,
746 {
747 let key = key.into();
748 self.obj.insert(key, value.serialize(Serializer)?);
749 Ok(())
750 }
751
752 fn end(self) -> Result<Self::Ok, Self::Error> {
753 let mut obj = Object::new();
754 obj.insert(self.name, Value::Object(self.obj));
755
756 Ok(Value::Object(obj))
757 }
758}
759
760pub enum SerializeMap {
761 Object { obj: Object, next_key: Option<Key> },
762 Number(Option<NumberBuf>),
763}
764
765impl serde::ser::SerializeMap for SerializeMap {
766 type Ok = Value;
767 type Error = SerializeError;
768
769 fn serialize_key<T>(&mut self, key: &T) -> Result<(), Self::Error>
770 where
771 T: ?Sized + Serialize,
772 {
773 match self {
774 Self::Number(_) => Err(SerializeError::MalformedHighPrecisionNumber),
775 Self::Object { obj, next_key } => {
776 let key = key.serialize(KeySerializer)?;
777
778 if obj.is_empty() && key == NUMBER_TOKEN {
779 *self = Self::Number(None)
780 } else {
781 *next_key = Some(key);
782 }
783
784 Ok(())
785 }
786 }
787 }
788
789 fn serialize_value<T>(&mut self, value: &T) -> Result<(), Self::Error>
790 where
791 T: ?Sized + Serialize,
792 {
793 match self {
794 Self::Number(n) => {
795 *n = Some(value.serialize(StringNumberSerializer)?);
796 Ok(())
797 }
798 Self::Object { obj, next_key } => {
799 let key = next_key
800 .take()
801 .expect("serialize_value called before serialize_key");
802 obj.insert(key, value.serialize(Serializer)?);
803 Ok(())
804 }
805 }
806 }
807
808 fn end(self) -> Result<Self::Ok, Self::Error> {
809 match self {
810 Self::Number(Some(n)) => Ok(Value::Number(n)),
811 Self::Number(None) => Err(SerializeError::MalformedHighPrecisionNumber),
812 Self::Object { obj, .. } => Ok(Value::Object(obj)),
813 }
814 }
815}
816
817impl serde::ser::SerializeStruct for SerializeMap {
818 type Ok = Value;
819 type Error = SerializeError;
820
821 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>
822 where
823 T: ?Sized + Serialize,
824 {
825 serde::ser::SerializeMap::serialize_entry(self, key, value)
826 }
827
828 fn end(self) -> Result<Self::Ok, Self::Error> {
829 serde::ser::SerializeMap::end(self)
830 }
831}