json_syntax/serde/
ser.rs

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
77/// [`Value`] serializer.
78pub 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}