Skip to content

Commit 669460a

Browse files
committed
target enum: serde SpirvTargetEnv like a target string
1 parent e9c02aa commit 669460a

File tree

4 files changed

+41
-1
lines changed

4 files changed

+41
-1
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/rustc_codegen_spirv-target-specs/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,6 @@ serde = ["dep:serde"]
1616
strum = { version = "0.26.3", features = ["derive"] }
1717
thiserror = "2.0.12"
1818
serde = { version = "1.0", features = ["derive"], optional = true }
19+
20+
[dev-dependencies]
21+
serde_json = "1.0"

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ pub const TARGET_SPEC_DIR_PATH: &str = concat!(env!("CARGO_MANIFEST_DIR"), "/tar
1111

1212
#[cfg(feature = "include_str")]
1313
mod include_str;
14+
#[cfg(feature = "serde")]
15+
mod serde;
1416

1517
pub const SPIRV_ARCH: &str = "spirv";
1618
pub const SPIRV_VENDOR: &str = "unknown";
@@ -19,7 +21,6 @@ pub const SPIRV_TARGET_PREFIX: &str = "spirv-unknown-";
1921
/// All target envs rust-gpu supports. The corresponding target tripple is `spirv-unknown-ENV` with `ENV` replaced by any of the values below.
2022
#[allow(non_camel_case_types, clippy::upper_case_acronyms)]
2123
#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash, EnumString, IntoStaticStr, EnumIter, Display)]
22-
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
2324
pub enum SpirvTargetEnv {
2425
#[strum(to_string = "opengl4.0")]
2526
OpenGL_4_0,
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
use crate::SpirvTargetEnv;
2+
use serde::{Deserialize, Deserializer, Serialize, Serializer};
3+
4+
impl Serialize for SpirvTargetEnv {
5+
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
6+
where
7+
S: Serializer,
8+
{
9+
serializer.serialize_str(&self.target_triple())
10+
}
11+
}
12+
13+
impl<'de> Deserialize<'de> for SpirvTargetEnv {
14+
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
15+
where
16+
D: Deserializer<'de>,
17+
{
18+
let target = String::deserialize(deserializer)?;
19+
Self::parse_triple(&target).map_err(|_e| serde::de::Error::unknown_variant(&target, &[]))
20+
}
21+
}
22+
23+
#[cfg(test)]
24+
mod tests {
25+
use crate::SpirvTargetEnv;
26+
27+
#[test]
28+
fn test_serde_roundtrip() {
29+
for env in SpirvTargetEnv::iter() {
30+
let json = serde_json::to_string(&env).unwrap();
31+
let deserialize: SpirvTargetEnv = serde_json::from_str(&json).unwrap();
32+
assert_eq!(env, deserialize);
33+
}
34+
}
35+
}

0 commit comments

Comments
 (0)