Skip to content

Commit bede829

Browse files
committed
target enum: fix serde impl for target not round tripping
1 parent 1d64638 commit bede829

File tree

2 files changed

+30
-6
lines changed

2 files changed

+30
-6
lines changed

crates/rustc_codegen_spirv-target-specs/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ pub enum SpirvTargetEnv {
6262
Vulkan_1_4,
6363
}
6464

65-
#[derive(Clone, Error)]
65+
#[derive(Clone, Error, Eq, PartialEq)]
6666
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6767
pub enum SpirvTargetParseError {
6868
#[error("Expected `rustc_codegen_spirv` target with prefix `{SPIRV_TARGET_PREFIX}`, got `{0}`")]

crates/rustc_codegen_spirv-target-specs/src/serde_feature.rs

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

4042
pub fn deserialize_target<'de, D>(
@@ -51,7 +53,8 @@ where
5153

5254
#[cfg(test)]
5355
mod 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

Comments
 (0)