1use super::Value;
2use alloc::{vec, vec::Vec};
3use serde::ser::{self};
4
5type Error = crate::ser::Error<core::convert::Infallible>;
6
7pub fn to_value<T>(value: T) -> Result<Value, Error>
9where
10 T: ser::Serialize,
11{
12 value.serialize(Serializer)
13}
14
15struct Serializer;
16
17impl ser::Serializer for Serializer {
18 type Ok = Value;
19 type Error = Error;
20 type SerializeSeq = SerializeSeq;
21 type SerializeTuple = SerializeSeq;
22 type SerializeTupleStruct = SerializeSeq;
23 type SerializeTupleVariant = SerializeTupleVariant;
24 type SerializeMap = SerializeMap;
25 type SerializeStruct = SerializeMap;
26 type SerializeStructVariant = SerializeStructVariant;
27
28 fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
29 Ok(Value::from(v))
30 }
31
32 fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
33 Ok(Value::from(v))
34 }
35
36 fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
37 Ok(Value::from(v))
38 }
39
40 fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
41 Ok(Value::from(v))
42 }
43
44 fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
45 Ok(Value::from(v))
46 }
47
48 fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
49 Ok(Value::from(v))
50 }
51
52 fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
53 Ok(Value::from(v))
54 }
55
56 fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
57 Ok(Value::from(v))
58 }
59
60 fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
61 Ok(Value::from(v))
62 }
63
64 fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
65 Ok(Value::from(v))
66 }
67
68 fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
69 Ok(Value::from(v))
70 }
71
72 fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
73 use crate::alloc::string::ToString;
74 Ok(Value::String(v.to_string()))
75 }
76
77 fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
78 Ok(Value::from(v))
79 }
80
81 fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
82 Ok(Value::from(v))
83 }
84
85 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
86 Ok(Value::Nil)
87 }
88
89 fn serialize_some<T>(self, value: &T) -> Result<Self::Ok, Self::Error>
90 where
91 T: ?Sized + ser::Serialize,
92 {
93 value.serialize(self)
94 }
95
96 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
97 self.serialize_none()
98 }
99
100 fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> {
101 self.serialize_none()
102 }
103
104 fn serialize_unit_variant(
105 self,
106 _name: &'static str,
107 _variant_index: u32,
108 variant: &'static str,
109 ) -> Result<Self::Ok, Self::Error> {
110 self.serialize_str(variant)
111 }
112
113 fn serialize_newtype_struct<T>(
114 self,
115 name: &'static str,
116 value: &T,
117 ) -> Result<Self::Ok, Self::Error>
118 where
119 T: ?Sized + ser::Serialize,
120 {
121 match name {
122 crate::extension::EXTENSION_STRUCT_NAME => {
123 let mut ser = SerializeExt::new();
124 value.serialize(&mut ser)?;
125 ser.into_value()
126 }
127 _ => value.serialize(self),
128 }
129 }
130
131 fn serialize_newtype_variant<T>(
132 self,
133 _name: &'static str,
134 _variant_index: u32,
135 variant: &'static str,
136 value: &T,
137 ) -> Result<Self::Ok, Self::Error>
138 where
139 T: ?Sized + ser::Serialize,
140 {
141 let val = value.serialize(self)?;
142 let key = Value::from(variant);
143 Ok(Value::Map(vec![(key, val)]))
144 }
145
146 fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
147 Ok(SerializeSeq::with_capacity(len))
148 }
149
150 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error> {
151 self.serialize_seq(Some(len))
152 }
153
154 fn serialize_tuple_struct(
155 self,
156 _name: &'static str,
157 len: usize,
158 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
159 self.serialize_seq(Some(len))
160 }
161
162 fn serialize_tuple_variant(
163 self,
164 _name: &'static str,
165 _variant_index: u32,
166 variant: &'static str,
167 len: usize,
168 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
169 Ok(SerializeTupleVariant::with_capacity(variant, len))
170 }
171
172 fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
173 Ok(SerializeMap::with_capacity(len))
174 }
175
176 fn serialize_struct(
177 self,
178 _name: &'static str,
179 len: usize,
180 ) -> Result<Self::SerializeStruct, Self::Error> {
181 self.serialize_map(Some(len))
182 }
183
184 fn serialize_struct_variant(
185 self,
186 _name: &'static str,
187 _variant_index: u32,
188 variant: &'static str,
189 len: usize,
190 ) -> Result<Self::SerializeStructVariant, Self::Error> {
191 Ok(SerializeStructVariant::with_capacity(variant, len))
192 }
193}
194
195struct SerializeSeq {
196 values: Vec<Value>,
197}
198
199impl SerializeSeq {
200 fn with_capacity(len: Option<usize>) -> Self {
201 Self {
202 values: len.map(Vec::with_capacity).unwrap_or_default(),
203 }
204 }
205}
206
207impl ser::SerializeSeq for SerializeSeq {
208 type Ok = Value;
209 type Error = Error;
210
211 fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>
212 where
213 T: ?Sized + ser::Serialize,
214 {
215 let val = value.serialize(Serializer)?;
216 self.values.push(val);
217 Ok(())
218 }
219
220 fn end(self) -> Result<Self::Ok, Self::Error> {
221 Ok(Value::Array(self.values))
222 }
223}
224
225impl ser::SerializeTuple for SerializeSeq {
226 type Ok = Value;
227 type Error = Error;
228
229 fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>
230 where
231 T: ?Sized + ser::Serialize,
232 {
233 ser::SerializeSeq::serialize_element(self, value)
234 }
235
236 fn end(self) -> Result<Self::Ok, Self::Error> {
237 ser::SerializeSeq::end(self)
238 }
239}
240
241impl ser::SerializeTupleStruct for SerializeSeq {
242 type Ok = Value;
243 type Error = Error;
244
245 fn serialize_field<T>(&mut self, value: &T) -> Result<(), Self::Error>
246 where
247 T: ?Sized + ser::Serialize,
248 {
249 ser::SerializeSeq::serialize_element(self, value)
250 }
251
252 fn end(self) -> Result<Self::Ok, Self::Error> {
253 ser::SerializeSeq::end(self)
254 }
255}
256
257struct SerializeTupleVariant {
258 variant_name: &'static str,
259 seq: SerializeSeq,
260}
261
262impl SerializeTupleVariant {
263 fn with_capacity(name: &'static str, len: usize) -> Self {
264 Self {
265 variant_name: name,
266 seq: SerializeSeq::with_capacity(Some(len)),
267 }
268 }
269}
270
271impl ser::SerializeTupleVariant for SerializeTupleVariant {
272 type Ok = Value;
273 type Error = Error;
274
275 fn serialize_field<T>(&mut self, value: &T) -> Result<(), Self::Error>
276 where
277 T: ?Sized + ser::Serialize,
278 {
279 ser::SerializeSeq::serialize_element(&mut self.seq, value)?;
280 Ok(())
281 }
282
283 fn end(self) -> Result<Self::Ok, Self::Error> {
284 let array = ser::SerializeSeq::end(self.seq)?;
285 let key = Value::from(self.variant_name);
286 Ok(Value::Map(vec![(key, array)]))
287 }
288}
289
290struct SerializeMap {
291 key: Option<Value>,
292 items: Vec<(Value, Value)>,
293}
294
295impl SerializeMap {
296 fn with_capacity(len: Option<usize>) -> Self {
297 Self {
298 items: len.map(Vec::with_capacity).unwrap_or_default(),
299 key: None,
300 }
301 }
302}
303
304impl ser::SerializeMap for SerializeMap {
305 type Ok = Value;
306 type Error = Error;
307
308 fn serialize_key<T>(&mut self, key: &T) -> Result<(), Self::Error>
309 where
310 T: ?Sized + ser::Serialize,
311 {
312 let key = key.serialize(Serializer)?;
313 self.key = Some(key);
314 Ok(())
315 }
316
317 fn serialize_value<T>(&mut self, value: &T) -> Result<(), Self::Error>
318 where
319 T: ?Sized + ser::Serialize,
320 {
321 let key = self
322 .key
323 .take()
324 .ok_or(<Error as ser::Error>::custom("missing map key"))?;
325 let val = value.serialize(Serializer)?;
326 self.items.push((key, val));
327 Ok(())
328 }
329
330 fn end(self) -> Result<Self::Ok, Self::Error> {
331 Ok(Value::Map(self.items))
332 }
333}
334
335impl ser::SerializeStruct for SerializeMap {
336 type Ok = Value;
337 type Error = Error;
338
339 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>
340 where
341 T: ?Sized + ser::Serialize,
342 {
343 ser::SerializeMap::serialize_key(self, key)?;
344 ser::SerializeMap::serialize_value(self, value)?;
345 Ok(())
346 }
347 fn end(self) -> Result<Self::Ok, Self::Error> {
348 ser::SerializeMap::end(self)
349 }
350}
351
352struct SerializeStructVariant {
353 variant_name: &'static str,
354 map: SerializeMap,
355}
356
357impl SerializeStructVariant {
358 fn with_capacity(name: &'static str, len: usize) -> Self {
359 Self {
360 variant_name: name,
361 map: SerializeMap::with_capacity(Some(len)),
362 }
363 }
364}
365
366impl ser::SerializeStructVariant for SerializeStructVariant {
367 type Ok = Value;
368 type Error = Error;
369 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>
370 where
371 T: ?Sized + ser::Serialize,
372 {
373 ser::SerializeStruct::serialize_field(&mut self.map, key, value)
374 }
375 fn end(self) -> Result<Self::Ok, Self::Error> {
376 let map = ser::SerializeStruct::end(self.map)?;
377 let key = Value::from(self.variant_name);
378 Ok(Value::Map(vec![(key, map)]))
379 }
380}
381
382struct SerializeExt {
383 format_seen: bool,
384 data_length: Option<u32>,
385 kind: Option<i8>,
386 data: Option<Vec<u8>>,
387}
388
389impl SerializeExt {
390 fn new() -> Self {
391 Self {
392 format_seen: false,
393 data_length: None,
394 kind: None,
395 data: None,
396 }
397 }
398
399 fn into_value(self) -> Result<Value, Error> {
400 let Self {
401 format_seen: _,
402 data_length: _,
403 kind,
404 data,
405 } = self;
406
407 let Some(kind) = kind else {
408 return Err(ser::Error::custom("extension type not found"));
409 };
410 let Some(data) = data else {
411 return Err(ser::Error::custom("extension data not found"));
412 };
413 let ext = messagepack_core::extension::ExtensionOwned::new(kind, data);
414 Ok(Value::from(ext))
415 }
416
417 fn unsupported_type() -> Error {
418 ser::Error::custom("support only `i8`, `u8`, `u16`, `u32`, `bytes` and `seq`")
419 }
420}
421
422impl AsMut<Self> for SerializeExt {
423 fn as_mut(&mut self) -> &mut Self {
424 self
425 }
426}
427
428impl<'a> ser::Serializer for &'a mut SerializeExt {
429 type Ok = ();
430 type Error = Error;
431
432 type SerializeSeq = SerializeExtSeq<'a>;
433 type SerializeTuple = serde::ser::Impossible<Self::Ok, Self::Error>;
434 type SerializeTupleStruct = serde::ser::Impossible<Self::Ok, Self::Error>;
435 type SerializeTupleVariant = serde::ser::Impossible<Self::Ok, Self::Error>;
436 type SerializeMap = serde::ser::Impossible<Self::Ok, Self::Error>;
437 type SerializeStruct = serde::ser::Impossible<Self::Ok, Self::Error>;
438 type SerializeStructVariant = serde::ser::Impossible<Self::Ok, Self::Error>;
439
440 fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
441 self.kind = Some(v);
442 Ok(())
443 }
444
445 fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
446 self.data_length = Some(u32::from(v));
447 Ok(())
448 }
449 fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
450 self.data_length = Some(u32::from(v));
451 Ok(())
452 }
453 fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
454 self.data_length = Some(v);
455 Ok(())
456 }
457
458 fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
459 if !self.format_seen {
461 self.format_seen = true;
462 return Ok(());
463 };
464
465 self.data = Some(v.to_vec());
466 Ok(())
467 }
468
469 fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
470 let seq = SerializeExtSeq { ser: self };
471 Ok(seq)
472 }
473
474 fn serialize_newtype_struct<T>(
475 self,
476 _name: &'static str,
477 value: &T,
478 ) -> Result<Self::Ok, Self::Error>
479 where
480 T: ?Sized + ser::Serialize,
481 {
482 value.serialize(self)
483 }
484
485 fn serialize_bool(self, _v: bool) -> Result<Self::Ok, Self::Error> {
486 Err(SerializeExt::unsupported_type())
487 }
488
489 fn serialize_i16(self, _v: i16) -> Result<Self::Ok, Self::Error> {
490 Err(SerializeExt::unsupported_type())
491 }
492
493 fn serialize_i32(self, _v: i32) -> Result<Self::Ok, Self::Error> {
494 Err(SerializeExt::unsupported_type())
495 }
496
497 fn serialize_i64(self, _v: i64) -> Result<Self::Ok, Self::Error> {
498 Err(SerializeExt::unsupported_type())
499 }
500
501 fn serialize_u64(self, _v: u64) -> Result<Self::Ok, Self::Error> {
502 Err(SerializeExt::unsupported_type())
503 }
504
505 fn serialize_f32(self, _v: f32) -> Result<Self::Ok, Self::Error> {
506 Err(SerializeExt::unsupported_type())
507 }
508
509 fn serialize_f64(self, _v: f64) -> Result<Self::Ok, Self::Error> {
510 Err(SerializeExt::unsupported_type())
511 }
512
513 fn serialize_char(self, _v: char) -> Result<Self::Ok, Self::Error> {
514 Err(SerializeExt::unsupported_type())
515 }
516
517 fn serialize_str(self, _v: &str) -> Result<Self::Ok, Self::Error> {
518 Err(SerializeExt::unsupported_type())
519 }
520
521 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
522 Err(SerializeExt::unsupported_type())
523 }
524
525 fn serialize_some<T>(self, _value: &T) -> Result<Self::Ok, Self::Error>
526 where
527 T: ?Sized + ser::Serialize,
528 {
529 Err(SerializeExt::unsupported_type())
530 }
531
532 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
533 Err(SerializeExt::unsupported_type())
534 }
535
536 fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> {
537 Err(SerializeExt::unsupported_type())
538 }
539
540 fn serialize_unit_variant(
541 self,
542 _name: &'static str,
543 _variant_index: u32,
544 _variant: &'static str,
545 ) -> Result<Self::Ok, Self::Error> {
546 Err(SerializeExt::unsupported_type())
547 }
548
549 fn serialize_newtype_variant<T>(
550 self,
551 _name: &'static str,
552 _variant_index: u32,
553 _variant: &'static str,
554 _value: &T,
555 ) -> Result<Self::Ok, Self::Error>
556 where
557 T: ?Sized + ser::Serialize,
558 {
559 Err(SerializeExt::unsupported_type())
560 }
561
562 fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, Self::Error> {
563 Err(SerializeExt::unsupported_type())
564 }
565
566 fn serialize_tuple_struct(
567 self,
568 _name: &'static str,
569 _len: usize,
570 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
571 Err(SerializeExt::unsupported_type())
572 }
573
574 fn serialize_tuple_variant(
575 self,
576 _name: &'static str,
577 _variant_index: u32,
578 _variant: &'static str,
579 _len: usize,
580 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
581 Err(SerializeExt::unsupported_type())
582 }
583
584 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
585 Err(SerializeExt::unsupported_type())
586 }
587
588 fn serialize_struct(
589 self,
590 _name: &'static str,
591 _len: usize,
592 ) -> Result<Self::SerializeStruct, Self::Error> {
593 Err(SerializeExt::unsupported_type())
594 }
595
596 fn serialize_struct_variant(
597 self,
598 _name: &'static str,
599 _variant_index: u32,
600 _variant: &'static str,
601 _len: usize,
602 ) -> Result<Self::SerializeStructVariant, Self::Error> {
603 Err(SerializeExt::unsupported_type())
604 }
605}
606
607struct SerializeExtSeq<'a> {
608 ser: &'a mut SerializeExt,
609}
610
611impl<'a> ser::SerializeSeq for SerializeExtSeq<'a> {
612 type Ok = ();
613 type Error = Error;
614 fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>
615 where
616 T: ?Sized + ser::Serialize,
617 {
618 value.serialize(self.ser.as_mut())
619 }
620
621 fn end(self) -> Result<Self::Ok, Self::Error> {
622 Ok(())
623 }
624}
625
626#[cfg(test)]
627mod tests {
628 use super::*;
629 use rstest::rstest;
630 use serde::Serialize;
631 use serde_bytes::ByteBuf;
632
633 #[derive(Serialize)]
634 enum Kind<'a> {
635 Unit,
636 New(u8),
637 Tup(u8, u16),
638 Str { a: bool, b: &'a str },
639 }
640
641 #[rstest]
642 #[case(Kind::Unit, Value::from("Unit"))]
643 #[case(Kind::New(5), Value::Map(
644 vec![(Value::from("New"), Value::from(5))]
645 ))]
646 #[case(Kind::Tup(1,2), Value::Map(
647 vec![(
648 Value::from("Tup"),
649 Value::Array(vec![Value::from(1), Value::from(2)])
650 )]
651 ))]
652 #[case(
653 Kind::Str { a: false, b: "hi" },
654 Value::Map(vec![(
655 Value::from("Str"),
656 Value::Map(vec![
657 (Value::from("a"), Value::from(false)),
658 (Value::from("b"), Value::from("hi")),
659 ]),
660 ),])
661 )]
662 fn serialize_enum(#[case] val: Kind, #[case] expected: Value) {
663 let serialized = val.serialize(Serializer).unwrap();
664 assert_eq!(serialized, expected);
665 }
666 #[derive(Debug, Serialize)]
667 struct WrappedRef(
668 #[serde(with = "crate::extension::ext_ref")]
669 messagepack_core::extension::ExtensionRef<'static>,
670 );
671
672 impl WrappedRef {
673 fn new(kind: i8, data: &'static [u8]) -> Self {
674 Self(messagepack_core::extension::ExtensionRef::new(kind, data))
675 }
676 }
677
678 #[rstest]
679 fn serialize_extension() {
680 let val = WrappedRef::new(8, &[1, 2, 3, 4]);
681 let serialized = val.serialize(Serializer).unwrap();
682
683 let expected = Value::Extension(messagepack_core::extension::ExtensionOwned::new(
684 8,
685 vec![1, 2, 3, 4],
686 ));
687
688 assert_eq!(serialized, expected);
689 }
690
691 #[rstest]
693 #[case(true)]
694 #[case(false)]
695 fn serialize_bool_primitives(#[case] v: bool) {
696 let serialized = v.serialize(Serializer).unwrap();
697 assert_eq!(serialized, Value::from(v));
698 }
699
700 #[rstest]
701 #[case(0i8)]
702 #[case(-1)]
703 #[case(127)]
704 fn serialize_i8_numbers(#[case] v: i8) {
705 let serialized = v.serialize(Serializer).unwrap();
706 assert_eq!(serialized, Value::from(v));
707 }
708
709 #[rstest]
710 #[case(0i16)]
711 #[case(-128)]
712 #[case(1024)]
713 fn serialize_i16_numbers(#[case] v: i16) {
714 let serialized = v.serialize(Serializer).unwrap();
715 assert_eq!(serialized, Value::from(v));
716 }
717
718 #[rstest]
719 #[case(0i32)]
720 #[case(-32768)]
721 #[case(1_000_000)]
722 fn serialize_i32_numbers(#[case] v: i32) {
723 let serialized = v.serialize(Serializer).unwrap();
724 assert_eq!(serialized, Value::from(v));
725 }
726
727 #[rstest]
728 #[case(0i64)]
729 #[case(-2147483648)]
730 #[case(9_223_372_036_854_775_807i64)]
731 fn serialize_i64_numbers(#[case] v: i64) {
732 let serialized = v.serialize(Serializer).unwrap();
733 assert_eq!(serialized, Value::from(v));
734 }
735
736 #[rstest]
737 #[case(0u8)]
738 #[case(255)]
739 fn serialize_u8_numbers(#[case] v: u8) {
740 let serialized = v.serialize(Serializer).unwrap();
741 assert_eq!(serialized, Value::from(v));
742 }
743
744 #[rstest]
745 #[case(0u16)]
746 #[case(65_535)]
747 fn serialize_u16_numbers(#[case] v: u16) {
748 let serialized = v.serialize(Serializer).unwrap();
749 assert_eq!(serialized, Value::from(v));
750 }
751
752 #[rstest]
753 #[case(0u32)]
754 #[case(4_294_967_295)]
755 fn serialize_u32_numbers(#[case] v: u32) {
756 let serialized = v.serialize(Serializer).unwrap();
757 assert_eq!(serialized, Value::from(v));
758 }
759
760 #[rstest]
761 #[case(0u64)]
762 #[case(18_446_744_073_709_551_615u64)]
763 fn serialize_u64_numbers(#[case] v: u64) {
764 let serialized = v.serialize(Serializer).unwrap();
765 assert_eq!(serialized, Value::from(v));
766 }
767
768 #[rstest]
769 #[case(0.0f32)]
770 #[case(-0.0)]
771 #[case(1.5)]
772 fn serialize_f32_numbers(#[case] v: f32) {
773 let serialized = v.serialize(Serializer).unwrap();
774 assert_eq!(serialized, Value::from(v));
775 }
776
777 #[rstest]
778 #[case(0.0f64)]
779 #[case(-0.0)]
780 #[case(1.5)]
781 fn serialize_f64_numbers(#[case] v: f64) {
782 let serialized = v.serialize(Serializer).unwrap();
783 assert_eq!(serialized, Value::from(v));
784 }
785
786 #[rstest]
787 #[case('a', Value::String("a".to_string()))]
788 #[case('😀', Value::String("😀".to_string()))]
789 fn serialize_char_as_string(#[case] ch: char, #[case] expected: Value) {
790 let serialized = ch.serialize(Serializer).unwrap();
791 assert_eq!(serialized, expected);
792 }
793
794 #[rstest]
795 #[case("")]
796 #[case("hello")]
797 fn serialize_strs(#[case] s: &str) {
798 let serialized = s.serialize(Serializer).unwrap();
799 assert_eq!(serialized, Value::from(s));
800 }
801
802 #[rstest]
803 #[case(vec![])]
804 #[case(vec![9u8, 8, 7, 6])]
805 fn serialize_bytes_via_bytebuf(#[case] data: Vec<u8>) {
806 let bb = ByteBuf::from(data.clone());
807 let serialized = bb.serialize(Serializer).unwrap();
808 assert_eq!(serialized, Value::Bin(data));
809 }
810
811 #[rstest]
812 #[case(vec![])]
813 #[case(vec![1u8, 2, 3])]
814 fn serialize_slice_u8_as_array(#[case] data: Vec<u8>) {
815 let s: &[u8] = &data;
816 let serialized = s.serialize(Serializer).unwrap();
817 assert_eq!(
818 serialized,
819 Value::Array(data.into_iter().map(Value::from).collect())
820 );
821 }
822
823 #[rstest]
824 #[case(vec![])]
825 #[case(vec![1u8, 2, 3])]
826 fn serialize_vec_u8_as_array(#[case] data: Vec<u8>) {
827 let serialized = data.serialize(Serializer).unwrap();
828 assert_eq!(
829 serialized,
830 Value::Array(data.into_iter().map(Value::from).collect())
831 );
832 }
833
834 #[rstest]
835 #[case(vec![])]
836 #[case(vec![1u8, 2, 3])]
837 fn serialize_bytes_via_bytes_wrapper(#[case] data: Vec<u8>) {
838 let bytes = serde_bytes::Bytes::new(&data);
839 let serialized = bytes.serialize(Serializer).unwrap();
840 assert_eq!(serialized, Value::Bin(data));
841 }
842
843 #[derive(Serialize)]
844 struct U;
845
846 #[rstest]
847 #[case(U)]
848 #[case(())]
849 #[case(Option::<u8>::None)]
850 fn serialize_option_unit_and_unit_struct<V>(#[case] val: V)
851 where
852 V: Serialize,
853 {
854 assert_eq!(val.serialize(Serializer).unwrap(), Value::Nil)
855 }
856
857 #[rstest]
858 fn serialize_newtype_struct_plain() {
859 #[derive(Serialize)]
860 struct Wrapper(u16);
861 let v = Wrapper(7);
862 assert_eq!(v.serialize(Serializer).unwrap(), Value::from(7));
864 }
865
866 #[derive(Serialize)]
867 struct Tup(u8, i16);
868
869 #[rstest]
870 #[case(
871 (1u8, 2u16, 3i32),
872 Value::Array(vec![Value::from(1), Value::from(2), Value::from(3)])
873 )]
874 #[case(
875 Tup(1, -2),
876 Value::Array(vec![Value::from(1), Value::from(-2)])
877 )]
878 fn serialize_tuple_and_tuple_struct<V>(#[case] val: V, #[case] expected: Value)
879 where
880 V: Serialize,
881 {
882 assert_eq!(val.serialize(Serializer).unwrap(), expected)
883 }
884
885 #[rstest]
886 fn serialize_struct_to_map() {
887 #[derive(Serialize)]
888 struct S<'a> {
889 a: u8,
890 #[serde(rename = "msg")]
891 b: &'a str,
892 }
893 let v = S { a: 7, b: "hi" };
894 let s = v.serialize(Serializer).unwrap();
895 assert_eq!(
896 s,
897 Value::Map(vec![
898 (Value::from("a"), Value::from(7u8)),
899 (Value::from("msg"), Value::from("hi")),
900 ])
901 );
902 }
903
904 #[test]
905 fn serialize_seq_and_map_with_unknown_len() {
906 struct DynSeq;
908 impl Serialize for DynSeq {
909 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
910 where
911 S: serde::Serializer,
912 {
913 use serde::ser::SerializeSeq;
914 let mut seq = serializer.serialize_seq(None)?;
915 seq.serialize_element(&1u8)?;
916 seq.serialize_element(&2u16)?;
917 seq.serialize_element(&3i32)?;
918 seq.end()
919 }
920 }
921 let seq_val = DynSeq.serialize(Serializer).unwrap();
922 assert_eq!(
923 seq_val,
924 Value::Array(vec![Value::from(1u8), Value::from(2u16), Value::from(3i32)])
925 );
926
927 struct DynMap;
929 impl Serialize for DynMap {
930 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
931 where
932 S: serde::Serializer,
933 {
934 use serde::ser::SerializeMap;
935 let mut map = serializer.serialize_map(None)?;
936 map.serialize_entry(&"k1", &10u8)?;
937 map.serialize_entry(&2u8, &"v2")?;
938 map.end()
939 }
940 }
941 let map_val = DynMap.serialize(Serializer).unwrap();
942 assert_eq!(
943 map_val,
944 Value::Map(vec![
945 (Value::from("k1"), Value::from(10u8)),
946 (Value::from(2u8), Value::from("v2")),
947 ])
948 );
949 }
950}