@@ -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