Skip to content

Commit c469e38

Browse files
committed
Terrible, but compatible.
1 parent 8249c7a commit c469e38

File tree

1 file changed

+58
-3
lines changed

1 file changed

+58
-3
lines changed

ahib-config/src/lib.rs

Lines changed: 58 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,13 +109,12 @@ impl TryFromSerdeDirectoryEntryWithContext<SerdePspDirectoryEntry>
109109
}
110110

111111
// See <https://github.com/serde-rs/serde/issues/1799>
112-
#[derive(Clone, serde::Serialize, serde::Deserialize, schemars::JsonSchema)]
112+
#[derive(Clone, serde::Serialize, schemars::JsonSchema)]
113113
#[serde(rename = "SerdePspEntrySourceValue")]
114114
#[serde(deny_unknown_fields)]
115+
#[non_exhaustive]
115116
pub enum SerdePspEntrySourceValue {
116117
PspSoftFuseChain(PspSoftFuseChain),
117-
#[serde(default)]
118-
Raw(u64),
119118
}
120119

121120
impl SerdePspEntrySourceValue {
@@ -143,6 +142,62 @@ impl SerdePspEntrySourceValue {
143142
}
144143
}
145144

145+
impl<'de> serde::Deserialize<'de> for SerdePspEntrySourceValue {
146+
fn deserialize<D: serde::Deserializer<'de>>(
147+
deserializer: D,
148+
) -> std::result::Result<Self, D::Error> {
149+
// rest delegate to PspSoftFuseChain, if that makes sense.
150+
struct ModeVisitor;
151+
impl<'de> serde::de::Visitor<'de> for ModeVisitor {
152+
type Value = SerdePspEntrySourceValue;
153+
fn expecting(
154+
&self,
155+
formatter: &mut core::fmt::Formatter<'_>,
156+
) -> core::fmt::Result {
157+
formatter.write_str("'Disabled', 'Enabled', 0 or 1")
158+
}
159+
fn visit_map<A>(
160+
self,
161+
map: A,
162+
) -> std::result::Result<Self::Value, A::Error>
163+
where
164+
A: serde::de::MapAccess<'de>,
165+
{
166+
// Delegate to PspSoftFuseChain's deserializer
167+
let chain = PspSoftFuseChain::deserialize(
168+
serde::de::value::MapAccessDeserializer::new(map),
169+
)?;
170+
Ok(SerdePspEntrySourceValue::PspSoftFuseChain(chain))
171+
}
172+
173+
fn visit_i64<E: serde::de::Error>(
174+
self,
175+
value: i64,
176+
) -> core::result::Result<Self::Value, E> {
177+
if value >= 0 {
178+
Ok(SerdePspEntrySourceValue::PspSoftFuseChain(
179+
PspSoftFuseChain::from(value as u64),
180+
))
181+
} else {
182+
Err(E::invalid_value(
183+
serde::de::Unexpected::Signed(value),
184+
&"a positive integer or PspSoftFuseChain",
185+
))
186+
}
187+
}
188+
fn visit_u64<E: serde::de::Error>(
189+
self,
190+
value: u64,
191+
) -> core::result::Result<Self::Value, E> {
192+
Ok(SerdePspEntrySourceValue::PspSoftFuseChain(
193+
PspSoftFuseChain::from(value),
194+
))
195+
}
196+
}
197+
deserializer.deserialize_any(ModeVisitor)
198+
}
199+
}
200+
146201
#[derive(Clone, serde::Serialize, serde::Deserialize, schemars::JsonSchema)]
147202
#[serde(rename = "PspEntrySource")]
148203
#[serde(deny_unknown_fields)]

0 commit comments

Comments
 (0)