1use indexmap::IndexMap;
4use serde::{ser::Impossible, Serialize};
5use std::fmt::Display;
6
7use super::{to_serde_value, SerdeValue, SerdeValueError, SerdeValueObject};
8
9impl Serialize for SerdeValue {
10 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
11 where
12 S: serde::Serializer,
13 {
14 match self {
15 SerdeValue::Null => serializer.serialize_unit(),
16 SerdeValue::Boolean(boolean) => serializer.serialize_bool(*boolean),
17 SerdeValue::Number(number) => number.serialize(serializer),
18 SerdeValue::String(string) => serializer.serialize_str(string),
19 SerdeValue::List(list) => list.serialize(serializer),
20 SerdeValue::Object(object) => object.serialize(serializer),
21 SerdeValue::Function(_) => serializer.serialize_unit(),
23 }
24 }
25}
26
27pub struct Serializer;
28
29impl serde::Serializer for Serializer {
30 type Ok = SerdeValue;
31 type Error = SerdeValueError;
32
33 type SerializeSeq = SerializeVec;
34 type SerializeTuple = SerializeVec;
35 type SerializeTupleStruct = SerializeVec;
36 type SerializeTupleVariant = SerializeTupleVariant;
37 type SerializeMap = SerializeMap;
38 type SerializeStruct = SerializeMap;
39 type SerializeStructVariant = SerializeStructVariant;
40
41 #[inline]
42 fn serialize_bool(self, value: bool) -> Result<SerdeValue, SerdeValueError> {
43 Ok(SerdeValue::Boolean(value))
44 }
45
46 #[inline]
47 fn serialize_i8(self, value: i8) -> Result<SerdeValue, SerdeValueError> {
48 self.serialize_i64(value as i64)
49 }
50
51 #[inline]
52 fn serialize_i16(self, value: i16) -> Result<SerdeValue, SerdeValueError> {
53 self.serialize_i64(value as i64)
54 }
55
56 #[inline]
57 fn serialize_i32(self, value: i32) -> Result<SerdeValue, SerdeValueError> {
58 self.serialize_i64(value as i64)
59 }
60
61 fn serialize_i64(self, value: i64) -> Result<SerdeValue, SerdeValueError> {
62 Ok(SerdeValue::Number(value.into()))
63 }
64
65 fn serialize_i128(self, value: i128) -> Result<SerdeValue, SerdeValueError> {
66 if let Ok(value) = u64::try_from(value) {
67 Ok(SerdeValue::Number(value.into()))
68 } else if let Ok(value) = i64::try_from(value) {
69 Ok(SerdeValue::Number(value.into()))
70 } else {
71 Err(SerdeValueError::NumberOutOfRange)
72 }
73 }
74
75 #[inline]
76 fn serialize_u8(self, value: u8) -> Result<SerdeValue, SerdeValueError> {
77 self.serialize_u64(value as u64)
78 }
79
80 #[inline]
81 fn serialize_u16(self, value: u16) -> Result<SerdeValue, SerdeValueError> {
82 self.serialize_u64(value as u64)
83 }
84
85 #[inline]
86 fn serialize_u32(self, value: u32) -> Result<SerdeValue, SerdeValueError> {
87 self.serialize_u64(value as u64)
88 }
89
90 #[inline]
91 fn serialize_u64(self, value: u64) -> Result<SerdeValue, SerdeValueError> {
92 Ok(SerdeValue::Number(value.into()))
93 }
94
95 fn serialize_u128(self, value: u128) -> Result<SerdeValue, SerdeValueError> {
96 if let Ok(value) = u64::try_from(value) {
97 Ok(SerdeValue::Number(value.into()))
98 } else {
99 Err(SerdeValueError::NumberOutOfRange)
100 }
101 }
102
103 #[inline]
104 fn serialize_f32(self, float: f32) -> Result<SerdeValue, SerdeValueError> {
105 Ok(SerdeValue::from(float))
106 }
107
108 #[inline]
109 fn serialize_f64(self, float: f64) -> Result<SerdeValue, SerdeValueError> {
110 Ok(SerdeValue::from(float))
111 }
112
113 #[inline]
114 fn serialize_char(self, value: char) -> Result<SerdeValue, SerdeValueError> {
115 let mut s = String::new();
116 s.push(value);
117 Ok(SerdeValue::String(s))
118 }
119
120 #[inline]
121 fn serialize_str(self, value: &str) -> Result<SerdeValue, SerdeValueError> {
122 Ok(SerdeValue::String(value.to_owned()))
123 }
124
125 fn serialize_bytes(self, value: &[u8]) -> Result<SerdeValue, SerdeValueError> {
126 let vec = value
127 .iter()
128 .map(|&b| SerdeValue::Number(b.into()))
129 .collect();
130 Ok(SerdeValue::List(vec))
131 }
132
133 #[inline]
134 fn serialize_unit(self) -> Result<SerdeValue, SerdeValueError> {
135 Ok(SerdeValue::Null)
136 }
137
138 #[inline]
139 fn serialize_unit_struct(self, _name: &'static str) -> Result<SerdeValue, SerdeValueError> {
140 self.serialize_unit()
141 }
142
143 #[inline]
144 fn serialize_unit_variant(
145 self,
146 _name: &'static str,
147 _variant_index: u32,
148 variant: &'static str,
149 ) -> Result<SerdeValue, SerdeValueError> {
150 self.serialize_str(variant)
151 }
152
153 #[inline]
154 fn serialize_newtype_struct<T>(
155 self,
156 _name: &'static str,
157 value: &T,
158 ) -> Result<SerdeValue, SerdeValueError>
159 where
160 T: ?Sized + Serialize,
161 {
162 value.serialize(self)
163 }
164
165 fn serialize_newtype_variant<T>(
166 self,
167 _name: &'static str,
168 _variant_index: u32,
169 variant: &'static str,
170 value: &T,
171 ) -> Result<SerdeValue, SerdeValueError>
172 where
173 T: ?Sized + Serialize,
174 {
175 let mut values = SerdeValueObject::new();
176 values.insert(String::from(variant), to_serde_value(value)?);
177 Ok(SerdeValue::Object(values))
178 }
179
180 #[inline]
181 fn serialize_none(self) -> Result<SerdeValue, SerdeValueError> {
182 self.serialize_unit()
183 }
184
185 #[inline]
186 fn serialize_some<T>(self, value: &T) -> Result<SerdeValue, SerdeValueError>
187 where
188 T: ?Sized + Serialize,
189 {
190 value.serialize(self)
191 }
192
193 fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, SerdeValueError> {
194 Ok(SerializeVec {
195 vec: Vec::with_capacity(len.unwrap_or(0)),
196 })
197 }
198
199 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, SerdeValueError> {
200 self.serialize_seq(Some(len))
201 }
202
203 fn serialize_tuple_struct(
204 self,
205 _name: &'static str,
206 len: usize,
207 ) -> Result<Self::SerializeTupleStruct, SerdeValueError> {
208 self.serialize_seq(Some(len))
209 }
210
211 fn serialize_tuple_variant(
212 self,
213 _name: &'static str,
214 _variant_index: u32,
215 variant: &'static str,
216 len: usize,
217 ) -> Result<Self::SerializeTupleVariant, SerdeValueError> {
218 Ok(SerializeTupleVariant {
219 name: String::from(variant),
220 vec: Vec::with_capacity(len),
221 })
222 }
223
224 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, SerdeValueError> {
225 Ok(SerializeMap::Map {
226 map: SerdeValueObject::new(),
227 next_key: None,
228 })
229 }
230
231 fn serialize_struct(
232 self,
233 _name: &'static str,
234 len: usize,
235 ) -> Result<Self::SerializeStruct, SerdeValueError> {
236 self.serialize_map(Some(len))
237 }
238
239 fn serialize_struct_variant(
240 self,
241 _name: &'static str,
242 _variant_index: u32,
243 variant: &'static str,
244 _len: usize,
245 ) -> Result<Self::SerializeStructVariant, SerdeValueError> {
246 Ok(SerializeStructVariant {
247 name: String::from(variant),
248 map: SerdeValueObject::new(),
249 })
250 }
251
252 fn collect_str<T>(self, value: &T) -> Result<SerdeValue, SerdeValueError>
253 where
254 T: ?Sized + Display,
255 {
256 Ok(SerdeValue::String(value.to_string()))
257 }
258}
259
260pub struct SerializeVec {
261 vec: Vec<SerdeValue>,
262}
263
264pub struct SerializeTupleVariant {
265 name: String,
266 vec: Vec<SerdeValue>,
267}
268
269pub enum SerializeMap {
270 Map {
271 map: IndexMap<String, SerdeValue>,
272 next_key: Option<String>,
273 },
274}
275
276pub struct SerializeStructVariant {
277 name: String,
278 map: IndexMap<String, SerdeValue>,
279}
280
281impl serde::ser::SerializeSeq for SerializeVec {
282 type Ok = SerdeValue;
283 type Error = SerdeValueError;
284
285 fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>
286 where
287 T: ?Sized + Serialize,
288 {
289 self.vec.push(to_serde_value(value)?);
290 Ok(())
291 }
292
293 fn end(self) -> Result<SerdeValue, SerdeValueError> {
294 Ok(SerdeValue::List(self.vec))
295 }
296}
297
298impl serde::ser::SerializeTuple for SerializeVec {
299 type Ok = SerdeValue;
300 type Error = SerdeValueError;
301
302 fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>
303 where
304 T: ?Sized + Serialize,
305 {
306 serde::ser::SerializeSeq::serialize_element(self, value)
307 }
308
309 fn end(self) -> Result<SerdeValue, Self::Error> {
310 serde::ser::SerializeSeq::end(self)
311 }
312}
313
314impl serde::ser::SerializeTupleStruct for SerializeVec {
315 type Ok = SerdeValue;
316 type Error = SerdeValueError;
317
318 fn serialize_field<T>(&mut self, value: &T) -> Result<(), Self::Error>
319 where
320 T: ?Sized + Serialize,
321 {
322 serde::ser::SerializeSeq::serialize_element(self, value)
323 }
324
325 fn end(self) -> Result<Self::Ok, Self::Error> {
326 serde::ser::SerializeSeq::end(self)
327 }
328}
329
330impl serde::ser::SerializeTupleVariant for SerializeTupleVariant {
331 type Ok = SerdeValue;
332 type Error = SerdeValueError;
333
334 fn serialize_field<T>(&mut self, value: &T) -> Result<(), Self::Error>
335 where
336 T: ?Sized + Serialize,
337 {
338 self.vec.push(to_serde_value(value)?);
339 Ok(())
340 }
341
342 fn end(self) -> Result<Self::Ok, Self::Error> {
343 let mut object = SerdeValueObject::new();
344
345 object.insert(self.name, SerdeValue::List(self.vec));
346
347 Ok(SerdeValue::Object(object))
348 }
349}
350
351impl serde::ser::SerializeMap for SerializeMap {
352 type Ok = SerdeValue;
353 type Error = SerdeValueError;
354
355 fn serialize_key<T>(&mut self, key: &T) -> Result<(), Self::Error>
356 where
357 T: ?Sized + Serialize,
358 {
359 match self {
360 SerializeMap::Map { next_key, .. } => {
361 *next_key = Some(key.serialize(MapKeySerializer)?);
362 Ok(())
363 }
364 }
365 }
366
367 fn serialize_value<T>(&mut self, value: &T) -> Result<(), Self::Error>
368 where
369 T: ?Sized + Serialize,
370 {
371 match self {
372 SerializeMap::Map { map, next_key } => {
373 let key = next_key.take();
374 let key = key.expect("serialize_value called before serialize_key");
377 map.insert(key, to_serde_value(value)?);
378 Ok(())
379 }
380 }
381 }
382
383 fn end(self) -> Result<Self::Ok, Self::Error> {
384 match self {
385 SerializeMap::Map { map, .. } => Ok(SerdeValue::Object(map)),
386 }
387 }
388}
389
390struct MapKeySerializer;
391
392fn key_must_be_a_string() -> SerdeValueError {
393 SerdeValueError::KeyMustBeAString
394}
395
396fn float_key_must_be_finite() -> SerdeValueError {
397 SerdeValueError::FloatKeyMustBeFinite
398}
399
400impl serde::Serializer for MapKeySerializer {
401 type Ok = String;
402 type Error = SerdeValueError;
403
404 type SerializeSeq = Impossible<String, SerdeValueError>;
405 type SerializeTuple = Impossible<String, SerdeValueError>;
406 type SerializeTupleStruct = Impossible<String, SerdeValueError>;
407 type SerializeTupleVariant = Impossible<String, SerdeValueError>;
408 type SerializeMap = Impossible<String, SerdeValueError>;
409 type SerializeStruct = Impossible<String, SerdeValueError>;
410 type SerializeStructVariant = Impossible<String, SerdeValueError>;
411
412 #[inline]
413 fn serialize_unit_variant(
414 self,
415 _name: &'static str,
416 _variant_index: u32,
417 variant: &'static str,
418 ) -> Result<String, Self::Error> {
419 Ok(variant.to_owned())
420 }
421
422 #[inline]
423 fn serialize_newtype_struct<T>(
424 self,
425 _name: &'static str,
426 value: &T,
427 ) -> Result<String, Self::Error>
428 where
429 T: ?Sized + Serialize,
430 {
431 value.serialize(self)
432 }
433
434 fn serialize_bool(self, _value: bool) -> Result<String, Self::Error> {
435 Err(key_must_be_a_string())
436 }
437
438 fn serialize_i8(self, value: i8) -> Result<String, Self::Error> {
439 Ok(value.to_string())
440 }
441
442 fn serialize_i16(self, value: i16) -> Result<String, SerdeValueError> {
443 Ok(value.to_string())
444 }
445
446 fn serialize_i32(self, value: i32) -> Result<String, SerdeValueError> {
447 Ok(value.to_string())
448 }
449
450 fn serialize_i64(self, value: i64) -> Result<String, SerdeValueError> {
451 Ok(value.to_string())
452 }
453
454 fn serialize_u8(self, value: u8) -> Result<String, SerdeValueError> {
455 Ok(value.to_string())
456 }
457
458 fn serialize_u16(self, value: u16) -> Result<String, SerdeValueError> {
459 Ok(value.to_string())
460 }
461
462 fn serialize_u32(self, value: u32) -> Result<String, SerdeValueError> {
463 Ok(value.to_string())
464 }
465
466 fn serialize_u64(self, value: u64) -> Result<String, SerdeValueError> {
467 Ok(value.to_string())
468 }
469
470 fn serialize_f32(self, value: f32) -> Result<String, SerdeValueError> {
471 if value.is_finite() {
472 Ok(ryu::Buffer::new().format_finite(value).to_owned())
473 } else {
474 Err(float_key_must_be_finite())
475 }
476 }
477
478 fn serialize_f64(self, value: f64) -> Result<String, SerdeValueError> {
479 if value.is_finite() {
480 Ok(ryu::Buffer::new().format_finite(value).to_owned())
481 } else {
482 Err(float_key_must_be_finite())
483 }
484 }
485
486 #[inline]
487 fn serialize_char(self, value: char) -> Result<String, SerdeValueError> {
488 Ok({
489 let mut s = String::new();
490 s.push(value);
491 s
492 })
493 }
494
495 #[inline]
496 fn serialize_str(self, value: &str) -> Result<String, SerdeValueError> {
497 Ok(value.to_owned())
498 }
499
500 fn serialize_bytes(self, _value: &[u8]) -> Result<String, SerdeValueError> {
501 Err(key_must_be_a_string())
502 }
503
504 fn serialize_unit(self) -> Result<String, SerdeValueError> {
505 Err(key_must_be_a_string())
506 }
507
508 fn serialize_unit_struct(self, _name: &'static str) -> Result<String, SerdeValueError> {
509 Err(key_must_be_a_string())
510 }
511
512 fn serialize_newtype_variant<T>(
513 self,
514 _name: &'static str,
515 _variant_index: u32,
516 _variant: &'static str,
517 _value: &T,
518 ) -> Result<String, SerdeValueError>
519 where
520 T: ?Sized + Serialize,
521 {
522 Err(key_must_be_a_string())
523 }
524
525 fn serialize_none(self) -> Result<String, SerdeValueError> {
526 Err(key_must_be_a_string())
527 }
528
529 fn serialize_some<T>(self, _value: &T) -> Result<String, SerdeValueError>
530 where
531 T: ?Sized + Serialize,
532 {
533 Err(key_must_be_a_string())
534 }
535
536 fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
537 Err(key_must_be_a_string())
538 }
539
540 fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, Self::Error> {
541 Err(key_must_be_a_string())
542 }
543
544 fn serialize_tuple_struct(
545 self,
546 _name: &'static str,
547 _len: usize,
548 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
549 Err(key_must_be_a_string())
550 }
551
552 fn serialize_tuple_variant(
553 self,
554 _name: &'static str,
555 _variant_index: u32,
556 _variant: &'static str,
557 _len: usize,
558 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
559 Err(key_must_be_a_string())
560 }
561
562 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
563 Err(key_must_be_a_string())
564 }
565
566 fn serialize_struct(
567 self,
568 _name: &'static str,
569 _len: usize,
570 ) -> Result<Self::SerializeStruct, Self::Error> {
571 Err(key_must_be_a_string())
572 }
573
574 fn serialize_struct_variant(
575 self,
576 _name: &'static str,
577 _variant_index: u32,
578 _variant: &'static str,
579 _len: usize,
580 ) -> Result<Self::SerializeStructVariant, SerdeValueError> {
581 Err(key_must_be_a_string())
582 }
583
584 fn collect_str<T>(self, value: &T) -> Result<String, SerdeValueError>
585 where
586 T: ?Sized + Display,
587 {
588 Ok(value.to_string())
589 }
590}
591
592impl serde::ser::SerializeStruct for SerializeMap {
593 type Ok = SerdeValue;
594 type Error = SerdeValueError;
595
596 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>
597 where
598 T: ?Sized + Serialize,
599 {
600 match self {
601 SerializeMap::Map { .. } => serde::ser::SerializeMap::serialize_entry(self, key, value),
602 }
603 }
604
605 fn end(self) -> Result<Self::Ok, Self::Error> {
606 match self {
607 SerializeMap::Map { .. } => serde::ser::SerializeMap::end(self),
608 }
609 }
610}
611
612impl serde::ser::SerializeStructVariant for SerializeStructVariant {
613 type Ok = SerdeValue;
614 type Error = SerdeValueError;
615
616 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), SerdeValueError>
617 where
618 T: ?Sized + Serialize,
619 {
620 self.map.insert(String::from(key), to_serde_value(value)?);
621 Ok(())
622 }
623
624 fn end(self) -> Result<Self::Ok, SerdeValueError> {
625 let mut object = SerdeValueObject::new();
626
627 object.insert(self.name, SerdeValue::Object(self.map));
628
629 Ok(SerdeValue::Object(object))
630 }
631}