@@ -29,12 +29,14 @@ where
29
29
S : Serializer ,
30
30
{
31
31
// 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) ,
34
35
Some ( Err ( _e) ) => Err ( Error :: custom (
35
36
"cannot serialize `target` that failed to parse" ,
36
- ) ) ,
37
- }
37
+ ) ) ?,
38
+ } ;
39
+ Serialize :: serialize ( & option, serializer)
38
40
}
39
41
40
42
pub fn deserialize_target < ' de , D > (
51
53
52
54
#[ cfg( test) ]
53
55
mod tests {
54
- use crate :: SpirvTargetEnv ;
56
+ use super :: * ;
57
+ use crate :: { SpirvTargetEnv , SpirvTargetParseError } ;
55
58
56
59
#[ test]
57
60
fn test_serde_roundtrip ( ) {
@@ -61,4 +64,25 @@ mod tests {
61
64
assert_eq ! ( env, deserialize) ;
62
65
}
63
66
}
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
+ }
64
88
}
0 commit comments