Skip to content

Commit ca54ac7

Browse files
authored
Merge pull request #405 from diondokter/master
Allow Level and LevelFilter to deserialize from the index_variant
2 parents aa4c037 + caaa559 commit ca54ac7

File tree

1 file changed

+71
-0
lines changed

1 file changed

+71
-0
lines changed

src/serde.rs

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,17 @@ impl<'de> Deserialize<'de> for Level {
6060

6161
self.visit_str(variant)
6262
}
63+
64+
fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>
65+
where
66+
E: Error,
67+
{
68+
let variant = LOG_LEVEL_NAMES[1..]
69+
.get(v as usize)
70+
.ok_or_else(|| Error::invalid_value(Unexpected::Unsigned(v), &self))?;
71+
72+
self.visit_str(variant)
73+
}
6374
}
6475

6576
impl<'de> DeserializeSeed<'de> for LevelIdentifier {
@@ -144,6 +155,17 @@ impl<'de> Deserialize<'de> for LevelFilter {
144155

145156
self.visit_str(variant)
146157
}
158+
159+
fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>
160+
where
161+
E: Error,
162+
{
163+
let variant = LOG_LEVEL_NAMES
164+
.get(v as usize)
165+
.ok_or_else(|| Error::invalid_value(Unexpected::Unsigned(v), &self))?;
166+
167+
self.visit_str(variant)
168+
}
147169
}
148170

149171
impl<'de> DeserializeSeed<'de> for LevelFilterIdentifier {
@@ -203,6 +225,14 @@ mod tests {
203225
]
204226
}
205227

228+
fn level_variant_tokens(variant: u32) -> [Token; 3] {
229+
[
230+
Token::Enum { name: "Level" },
231+
Token::U32(variant),
232+
Token::Unit,
233+
]
234+
}
235+
206236
fn level_filter_token(variant: &'static str) -> Token {
207237
Token::UnitVariant {
208238
name: "LevelFilter",
@@ -220,6 +250,16 @@ mod tests {
220250
]
221251
}
222252

253+
fn level_filter_variant_tokens(variant: u32) -> [Token; 3] {
254+
[
255+
Token::Enum {
256+
name: "LevelFilter",
257+
},
258+
Token::U32(variant),
259+
Token::Unit,
260+
]
261+
}
262+
223263
#[test]
224264
fn test_level_ser_de() {
225265
let cases = [
@@ -265,6 +305,21 @@ mod tests {
265305
}
266306
}
267307

308+
#[test]
309+
fn test_level_de_variant_index() {
310+
let cases = [
311+
(Level::Error, level_variant_tokens(0)),
312+
(Level::Warn, level_variant_tokens(1)),
313+
(Level::Info, level_variant_tokens(2)),
314+
(Level::Debug, level_variant_tokens(3)),
315+
(Level::Trace, level_variant_tokens(4)),
316+
];
317+
318+
for &(value, tokens) in &cases {
319+
assert_de_tokens(&value, &tokens);
320+
}
321+
}
322+
268323
#[test]
269324
fn test_level_de_error() {
270325
let msg = "unknown variant `errorx`, expected one of \
@@ -320,6 +375,22 @@ mod tests {
320375
}
321376
}
322377

378+
#[test]
379+
fn test_level_filter_de_variant_index() {
380+
let cases = [
381+
(LevelFilter::Off, level_filter_variant_tokens(0)),
382+
(LevelFilter::Error, level_filter_variant_tokens(1)),
383+
(LevelFilter::Warn, level_filter_variant_tokens(2)),
384+
(LevelFilter::Info, level_filter_variant_tokens(3)),
385+
(LevelFilter::Debug, level_filter_variant_tokens(4)),
386+
(LevelFilter::Trace, level_filter_variant_tokens(5)),
387+
];
388+
389+
for &(value, tokens) in &cases {
390+
assert_de_tokens(&value, &tokens);
391+
}
392+
}
393+
323394
#[test]
324395
fn test_level_filter_de_error() {
325396
let msg = "unknown variant `errorx`, expected one of \

0 commit comments

Comments
 (0)