@@ -62,7 +62,9 @@ impl ser::Error for Error {
62
62
}
63
63
}
64
64
65
- struct Serializer ;
65
+ struct Serializer {
66
+ named_structs : bool
67
+ }
66
68
67
69
/// Convert a `T` into `rmpv::Value` which is an enum that can represent any valid MessagePack data.
68
70
///
@@ -77,7 +79,27 @@ struct Serializer;
77
79
/// ```
78
80
#[ inline]
79
81
pub fn to_value < T : Serialize > ( value : T ) -> Result < Value , Error > {
80
- value. serialize ( Serializer )
82
+ value. serialize ( Serializer {
83
+ named_structs : false
84
+ } )
85
+ }
86
+
87
+ /// The same as `rmpv::ext::to_value` with the variation that Structs are encoded as Value::Map
88
+ ///
89
+ /// ```rust
90
+ /// # use rmpv::Value;
91
+ ///
92
+ /// struct Book { name: String }
93
+ ///
94
+ /// let val = rmpv::ext::to_value_named(Book { name: "James".into() }).unwrap();
95
+ ///
96
+ /// assert_eq!(Value::Map(vec![(Value::String("name"), Value::String("John Smith".into()))]), val);
97
+ /// ```
98
+ #[ inline]
99
+ pub fn to_value_named < T : Serialize > ( value : T ) -> Result < Value , Error > {
100
+ value. serialize ( Serializer {
101
+ named_structs : true
102
+ } )
81
103
}
82
104
83
105
impl ser:: Serializer for Serializer {
@@ -89,7 +111,7 @@ impl ser::Serializer for Serializer {
89
111
type SerializeTupleStruct = SerializeVec ;
90
112
type SerializeTupleVariant = SerializeTupleVariant ;
91
113
type SerializeMap = DefaultSerializeMap ;
92
- type SerializeStruct = SerializeVec ;
114
+ type SerializeStruct = DefaultSerializeStruct ;
93
115
type SerializeStructVariant = SerializeStructVariant ;
94
116
95
117
#[ inline]
@@ -221,6 +243,7 @@ impl ser::Serializer for Serializer {
221
243
222
244
fn serialize_seq ( self , len : Option < usize > ) -> Result < Self :: SerializeSeq , Self :: Error > {
223
245
let se = SerializeVec {
246
+ named : self . named_structs ,
224
247
vec : Vec :: with_capacity ( len. unwrap_or ( 0 ) )
225
248
} ;
226
249
Ok ( se)
@@ -236,6 +259,7 @@ impl ser::Serializer for Serializer {
236
259
237
260
fn serialize_tuple_variant ( self , _name : & ' static str , idx : u32 , _variant : & ' static str , len : usize ) -> Result < Self :: SerializeTupleVariant , Error > {
238
261
let se = SerializeTupleVariant {
262
+ named : self . named_structs ,
239
263
idx,
240
264
vec : Vec :: with_capacity ( len) ,
241
265
} ;
@@ -244,20 +268,26 @@ impl ser::Serializer for Serializer {
244
268
245
269
fn serialize_map ( self , len : Option < usize > ) -> Result < Self :: SerializeMap , Error > {
246
270
let se = DefaultSerializeMap {
271
+ named : self . named_structs ,
247
272
map : Vec :: with_capacity ( len. unwrap_or ( 0 ) ) ,
248
273
next_key : None ,
249
274
} ;
250
275
Ok ( se)
251
276
}
252
277
253
278
#[ inline]
254
- fn serialize_struct ( self , name : & ' static str , len : usize ) -> Result < Self :: SerializeStruct , Error > {
255
- self . serialize_tuple_struct ( name, len)
279
+ fn serialize_struct ( self , _name : & ' static str , len : usize ) -> Result < Self :: SerializeStruct , Error > {
280
+ let se = DefaultSerializeStruct {
281
+ named : self . named_structs ,
282
+ map : Vec :: with_capacity ( len) ,
283
+ } ;
284
+ return Ok ( se)
256
285
}
257
286
258
287
#[ inline]
259
288
fn serialize_struct_variant ( self , _name : & ' static str , idx : u32 , _variant : & ' static str , len : usize ) -> Result < Self :: SerializeStructVariant , Error > {
260
289
let se = SerializeStructVariant {
290
+ named : self . named_structs ,
261
291
idx,
262
292
vec : Vec :: with_capacity ( len) ,
263
293
} ;
@@ -665,25 +695,35 @@ impl ExtFieldSerializer {
665
695
666
696
#[ doc( hidden) ]
667
697
pub struct SerializeVec {
698
+ named : bool ,
668
699
vec : Vec < Value > ,
669
700
}
670
701
671
702
/// Default implementation for tuple variant serialization. It packs given enums as a tuple of an
672
703
/// index with a tuple of arguments.
673
704
#[ doc( hidden) ]
674
705
pub struct SerializeTupleVariant {
706
+ named : bool ,
675
707
idx : u32 ,
676
708
vec : Vec < Value > ,
677
709
}
678
710
679
711
#[ doc( hidden) ]
680
712
pub struct DefaultSerializeMap {
713
+ named : bool ,
681
714
map : Vec < ( Value , Value ) > ,
682
715
next_key : Option < Value > ,
683
716
}
684
717
718
+ #[ doc( hidden) ]
719
+ pub struct DefaultSerializeStruct {
720
+ named : bool ,
721
+ map : Vec < ( Value , Value ) > ,
722
+ }
723
+
685
724
#[ doc( hidden) ]
686
725
pub struct SerializeStructVariant {
726
+ named : bool ,
687
727
idx : u32 ,
688
728
vec : Vec < Value > ,
689
729
}
@@ -696,7 +736,11 @@ impl SerializeSeq for SerializeVec {
696
736
fn serialize_element < T : ?Sized > ( & mut self , value : & T ) -> Result < ( ) , Error >
697
737
where T : Serialize
698
738
{
699
- self . vec . push ( to_value ( value) ?) ;
739
+ let value = match self . named {
740
+ true => to_value_named ( value) ?,
741
+ false => to_value ( value) ?,
742
+ } ;
743
+ self . vec . push ( value) ;
700
744
Ok ( ( ) )
701
745
}
702
746
@@ -748,7 +792,11 @@ impl ser::SerializeTupleVariant for SerializeTupleVariant {
748
792
fn serialize_field < T : ?Sized > ( & mut self , value : & T ) -> Result < ( ) , Error >
749
793
where T : Serialize
750
794
{
751
- self . vec . push ( to_value ( value) ?) ;
795
+ let value = match self . named {
796
+ true => to_value_named ( value) ?,
797
+ false => to_value ( value) ?,
798
+ } ;
799
+ self . vec . push ( value) ;
752
800
Ok ( ( ) )
753
801
}
754
802
@@ -777,7 +825,11 @@ impl ser::SerializeMap for DefaultSerializeMap {
777
825
// expected failure.
778
826
let key = self . next_key . take ( )
779
827
. expect ( "`serialize_value` called before `serialize_key`" ) ;
780
- self . map . push ( ( key, to_value ( value) ?) ) ;
828
+ let value = match self . named {
829
+ true => to_value_named ( value) ?,
830
+ false => to_value ( value) ?,
831
+ } ;
832
+ self . map . push ( ( key, value) ) ;
781
833
Ok ( ( ) )
782
834
}
783
835
@@ -787,20 +839,30 @@ impl ser::SerializeMap for DefaultSerializeMap {
787
839
}
788
840
}
789
841
790
- impl SerializeStruct for SerializeVec {
842
+ impl SerializeStruct for DefaultSerializeStruct {
791
843
type Ok = Value ;
792
844
type Error = Error ;
793
845
794
846
#[ inline]
795
- fn serialize_field < T : ?Sized > ( & mut self , _key : & ' static str , value : & T ) -> Result < ( ) , Error >
847
+ fn serialize_field < T : ?Sized > ( & mut self , key : & ' static str , value : & T ) -> Result < ( ) , Error >
796
848
where T : Serialize
797
849
{
798
- ser:: SerializeSeq :: serialize_element ( self , value)
850
+ let value = match self . named {
851
+ true => to_value_named ( value) ?,
852
+ false => to_value ( value) ?,
853
+ } ;
854
+ self . map . push ( ( to_value ( key) ?, value) ) ;
855
+ Ok ( ( ) )
799
856
}
800
857
801
858
#[ inline]
802
859
fn end ( self ) -> Result < Value , Error > {
803
- ser:: SerializeSeq :: end ( self )
860
+ if self . named {
861
+ return Ok ( Value :: Map ( self . map ) )
862
+ }
863
+
864
+ let stripped_keys: Vec < Value > = self . map . into_iter ( ) . map ( |( _, val) | val) . collect ( ) ;
865
+ Ok ( Value :: Array ( stripped_keys) )
804
866
}
805
867
}
806
868
@@ -812,7 +874,11 @@ impl ser::SerializeStructVariant for SerializeStructVariant {
812
874
fn serialize_field < T : ?Sized > ( & mut self , _key : & ' static str , value : & T ) -> Result < ( ) , Error >
813
875
where T : Serialize
814
876
{
815
- self . vec . push ( to_value ( value) ?) ;
877
+ let value = match self . named {
878
+ true => to_value_named ( value) ?,
879
+ false => to_value ( value) ?,
880
+ } ;
881
+ self . vec . push ( value) ;
816
882
Ok ( ( ) )
817
883
}
818
884
0 commit comments