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