@@ -22,38 +22,49 @@ use crate::{
2222/// See: https://gitlab.gnome.org/GNOME/gcr/-/merge_requests/169
2323mod double_value_optional {
2424 use serde:: ser:: SerializeStruct ;
25+ use zvariant:: DynamicType ;
2526
2627 use super :: * ;
2728
28- struct DoubleValueSerialize < ' a , T : Type + serde:: Serialize > ( pub & ' a Option < T > ) ;
29+ struct DoubleValueSerialize < ' a , T : Type + serde:: Serialize + DynamicType > ( pub & ' a Option < T > ) ;
2930
30- impl < T : Type + serde:: Serialize > serde:: Serialize for DoubleValueSerialize < ' _ , T > {
31+ impl < T : Type + serde:: Serialize + DynamicType > serde:: Serialize for DoubleValueSerialize < ' _ , T > {
3132 fn serialize < S > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error >
3233 where
3334 S : serde:: Serializer ,
3435 {
35- struct InnerVariant < ' a , U : Type + serde:: Serialize > ( & ' a Option < U > ) ;
36-
37- impl < U : Type + serde:: Serialize > serde:: Serialize for InnerVariant < ' _ , U > {
38- fn serialize < S2 > ( & self , serializer : S2 ) -> Result < S2 :: Ok , S2 :: Error >
39- where
40- S2 : serde:: Serializer ,
41- {
42- as_value:: optional:: serialize ( self . 0 , serializer)
36+ match self . 0 {
37+ Some ( v) => {
38+ struct InnerVariant < ' a , U : Type + serde:: Serialize + DynamicType > ( & ' a U ) ;
39+
40+ impl < U : Type + serde:: Serialize + DynamicType > serde:: Serialize for InnerVariant < ' _ , U > {
41+ fn serialize < S2 > ( & self , serializer : S2 ) -> Result < S2 :: Ok , S2 :: Error >
42+ where
43+ S2 : serde:: Serializer ,
44+ {
45+ // Serialize as a Variant containing the value
46+ let mut inner_structure = serializer. serialize_struct ( "Variant" , 2 ) ?;
47+ let sig = self . 0 . signature ( ) . to_string ( ) ;
48+ inner_structure. serialize_field ( "signature" , & sig) ?;
49+ inner_structure. serialize_field ( "value" , self . 0 ) ?;
50+ inner_structure. end ( )
51+ }
52+ }
53+
54+ let mut outer_structure = serializer. serialize_struct ( "Variant" , 2 ) ?;
55+ outer_structure. serialize_field ( "signature" , "v" ) ?;
56+ outer_structure. serialize_field ( "value" , & InnerVariant ( v) ) ?;
57+ outer_structure. end ( )
4358 }
59+ None => serializer. serialize_none ( ) ,
4460 }
45-
46- let mut outer_structure = serializer. serialize_struct ( "Variant" , 2 ) ?;
47- outer_structure. serialize_field ( "signature" , "v" ) ?;
48- outer_structure. serialize_field ( "value" , & InnerVariant ( self . 0 ) ) ?;
49- outer_structure. end ( )
5061 }
5162 }
5263
5364 pub fn serialize < S , T > ( value : & Option < T > , serializer : S ) -> Result < S :: Ok , S :: Error >
5465 where
5566 S : serde:: Serializer ,
56- T : serde:: Serialize + zvariant:: Type ,
67+ T : serde:: Serialize + zvariant:: Type + DynamicType ,
5768 {
5869 DoubleValueSerialize ( value) . serialize ( serializer)
5970 }
0 commit comments