@@ -29,12 +29,14 @@ where
2929    S :  Serializer , 
3030{ 
3131    // cannot use `transpose()` due to target being a ref, not a value 
32-     match  target { 
33-         Some ( Ok ( _) )  | None  => Serialize :: serialize ( target,  serializer) , 
32+     let  option = match  target { 
33+         None  => None , 
34+         Some ( Ok ( e) )  => Some ( * e) , 
3435        Some ( Err ( _e) )  => Err ( Error :: custom ( 
3536            "cannot serialize `target` that failed to parse" , 
36-         ) ) , 
37-     } 
37+         ) ) ?, 
38+     } ; 
39+     Serialize :: serialize ( & option,  serializer) 
3840} 
3941
4042pub  fn  deserialize_target < ' de ,  D > ( 
5153
5254#[ cfg( test) ]  
5355mod  tests { 
54-     use  crate :: SpirvTargetEnv ; 
56+     use  super :: * ; 
57+     use  crate :: { SpirvTargetEnv ,  SpirvTargetParseError } ; 
5558
5659    #[ test]  
5760    fn  test_serde_roundtrip ( )  { 
@@ -61,4 +64,25 @@ mod tests {
6164            assert_eq ! ( env,  deserialize) ; 
6265        } 
6366    } 
67+ 
68+     #[ test]  
69+     fn  test_serde_target_roundtrip ( )  { 
70+         #[ derive( Clone ,  Debug ,  Eq ,  PartialEq ,  serde:: Deserialize ,  serde:: Serialize ) ]  
71+         struct  FakeSpirvBuilder  { 
72+             #[ serde(  
73+                 serialize_with = "serialize_target" ,  
74+                 deserialize_with = "deserialize_target"  
75+             ) ]  
76+             target :  Option < Result < SpirvTargetEnv ,  SpirvTargetParseError > > , 
77+         } 
78+ 
79+         for  env in  SpirvTargetEnv :: iter ( )  { 
80+             let  builder = FakeSpirvBuilder  { 
81+                 target :  Some ( Ok ( env) ) , 
82+             } ; 
83+             let  json = serde_json:: to_string ( & builder) . unwrap ( ) ; 
84+             let  deserialize:  FakeSpirvBuilder  = serde_json:: from_str ( & json) . unwrap ( ) ; 
85+             assert_eq ! ( builder,  deserialize) ; 
86+         } 
87+     } 
6488} 
0 commit comments