@@ -109,13 +109,12 @@ impl TryFromSerdeDirectoryEntryWithContext<SerdePspDirectoryEntry>
109
109
}
110
110
111
111
// 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 ) ]
113
113
#[ serde( rename = "SerdePspEntrySourceValue" ) ]
114
114
#[ serde( deny_unknown_fields) ]
115
+ #[ non_exhaustive]
115
116
pub enum SerdePspEntrySourceValue {
116
117
PspSoftFuseChain ( PspSoftFuseChain ) ,
117
- #[ serde( default ) ]
118
- Raw ( u64 ) ,
119
118
}
120
119
121
120
impl SerdePspEntrySourceValue {
@@ -143,6 +142,62 @@ impl SerdePspEntrySourceValue {
143
142
}
144
143
}
145
144
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
+
146
201
#[ derive( Clone , serde:: Serialize , serde:: Deserialize , schemars:: JsonSchema ) ]
147
202
#[ serde( rename = "PspEntrySource" ) ]
148
203
#[ serde( deny_unknown_fields) ]
0 commit comments