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