Skip to main content

json_syntax/serde/ser/
mod.rs

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
81/// [`JsonValue`] serializer.
82pub 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}