Skip to content

Commit 8c774bd

Browse files
daymDanny Milosavljevic
authored and
Danny Milosavljevic
committed
ondisk: Add compat deserializer for FchConsoleOutMode.
Fixes <#132>.
1 parent d9de1bf commit 8c774bd

File tree

3 files changed

+117
-2
lines changed

3 files changed

+117
-2
lines changed

Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "amd-apcb"
3-
version = "0.3.1"
3+
version = "0.3.2"
44
authors = ["Oxide Computer"]
55
edition = "2021"
66

src/ondisk.rs

+56-1
Original file line numberDiff line numberDiff line change
@@ -7218,14 +7218,69 @@ pub enum CcxSmtControl {
72187218
}
72197219

72207220
#[derive(Debug, PartialEq, FromPrimitive, ToPrimitive, Copy, Clone)]
7221-
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
7221+
#[cfg_attr(feature = "serde", derive(Serialize))]
72227222
#[cfg_attr(feature = "serde", serde(deny_unknown_fields))]
72237223
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
72247224
pub enum FchConsoleOutMode {
72257225
Disabled = 0,
72267226
Enabled = 1,
72277227
}
72287228

7229+
#[cfg(feature = "serde")]
7230+
impl<'de> serde::Deserialize<'de> for FchConsoleOutMode {
7231+
fn deserialize<D: serde::Deserializer<'de>>(
7232+
deserializer: D,
7233+
) -> std::result::Result<Self, D::Error> {
7234+
struct ModeVisitor;
7235+
impl<'de> serde::de::Visitor<'de> for ModeVisitor {
7236+
type Value = FchConsoleOutMode;
7237+
fn expecting(
7238+
&self,
7239+
formatter: &mut core::fmt::Formatter<'_>,
7240+
) -> core::fmt::Result {
7241+
formatter.write_str("'Disabled', 'Enabled', 0 or 1")
7242+
}
7243+
fn visit_str<E: serde::de::Error>(
7244+
self,
7245+
v: &str,
7246+
) -> core::result::Result<Self::Value, E> {
7247+
match v {
7248+
"Disabled" => Ok(FchConsoleOutMode::Disabled),
7249+
"Enabled" => Ok(FchConsoleOutMode::Enabled),
7250+
_ => Err(serde::de::Error::custom(
7251+
"'Disabled', 'Enabled', 0 or 1 was expected",
7252+
)),
7253+
}
7254+
}
7255+
fn visit_i64<E: serde::de::Error>(
7256+
self,
7257+
value: i64,
7258+
) -> core::result::Result<Self::Value, E> {
7259+
match value {
7260+
0 => Ok(FchConsoleOutMode::Disabled),
7261+
1 => Ok(FchConsoleOutMode::Enabled),
7262+
_ => Err(serde::de::Error::custom(
7263+
"'Disabled', 'Enabled', 0 or 1 was expected",
7264+
)),
7265+
}
7266+
}
7267+
fn visit_u64<E: serde::de::Error>(
7268+
self,
7269+
value: u64,
7270+
) -> core::result::Result<Self::Value, E> {
7271+
match value {
7272+
0 => Ok(FchConsoleOutMode::Disabled),
7273+
1 => Ok(FchConsoleOutMode::Enabled),
7274+
_ => Err(serde::de::Error::custom(
7275+
"'Disabled', 'Enabled', 0 or 1 was expected",
7276+
)),
7277+
}
7278+
}
7279+
}
7280+
deserializer.deserialize_any(ModeVisitor)
7281+
}
7282+
}
7283+
72297284
#[derive(Debug, PartialEq, FromPrimitive, ToPrimitive, Copy, Clone)]
72307285
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
72317286
#[cfg_attr(feature = "serde", serde(deny_unknown_fields))]

tests/compat.rs

+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
#[cfg(feature = "serde")]
2+
#[test]
3+
#[allow(non_snake_case)]
4+
fn test_current_FchConsoleOutMode_Disabled() {
5+
let mode: amd_apcb::FchConsoleOutMode =
6+
serde_yaml::from_str("\"Disabled\"")
7+
.expect("configuration be valid JSON");
8+
assert_eq!(mode, amd_apcb::FchConsoleOutMode::Disabled);
9+
}
10+
11+
#[cfg(feature = "serde")]
12+
#[test]
13+
#[allow(non_snake_case)]
14+
fn test_current_FchConsoleOutMode_Enabled() {
15+
let mode: amd_apcb::FchConsoleOutMode = serde_yaml::from_str("\"Enabled\"")
16+
.expect("configuration be valid JSON");
17+
assert_eq!(mode, amd_apcb::FchConsoleOutMode::Enabled);
18+
}
19+
20+
#[cfg(feature = "serde")]
21+
#[test]
22+
#[allow(non_snake_case)]
23+
fn test_compat_FchConsoleOutMode_0() {
24+
let mode: amd_apcb::FchConsoleOutMode =
25+
serde_yaml::from_str("0").expect("configuration be valid JSON");
26+
assert_eq!(mode, amd_apcb::FchConsoleOutMode::Disabled);
27+
}
28+
29+
#[cfg(feature = "serde")]
30+
#[test]
31+
#[allow(non_snake_case)]
32+
fn test_compat_FchConsoleOutMode_1() {
33+
let mode: amd_apcb::FchConsoleOutMode =
34+
serde_yaml::from_str("1").expect("configuration be valid JSON");
35+
assert_eq!(mode, amd_apcb::FchConsoleOutMode::Enabled);
36+
}
37+
38+
#[cfg(feature = "serde")]
39+
#[test]
40+
#[allow(non_snake_case)]
41+
fn test_invalid_FchConsoleOutMode() {
42+
match serde_yaml::from_str::<amd_apcb::FchConsoleOutMode>("\"Disabledx\"") {
43+
Ok(_) => {
44+
panic!("unexpected success");
45+
}
46+
Err(_) => {}
47+
};
48+
}
49+
50+
#[cfg(feature = "serde")]
51+
#[test]
52+
#[allow(non_snake_case)]
53+
fn test_invalid_FchConsoleOutMode_5() {
54+
match serde_yaml::from_str::<amd_apcb::FchConsoleOutMode>("5") {
55+
Ok(_) => {
56+
panic!("unexpected success");
57+
}
58+
Err(_) => {}
59+
};
60+
}

0 commit comments

Comments
 (0)