@@ -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