@@ -200,6 +200,21 @@ impl<L: LogLevel> fmt::Display for Verbosity<L> {
200
200
}
201
201
}
202
202
203
+ impl < L : LogLevel > From < Verbosity < L > > for VerbosityFilter {
204
+ fn from ( verbosity : Verbosity < L > ) -> Self {
205
+ verbosity. filter ( )
206
+ }
207
+ }
208
+
209
+ impl < L : LogLevel > From < VerbosityFilter > for Verbosity < L > {
210
+ fn from ( filter : VerbosityFilter ) -> Self {
211
+ let default = L :: default_filter ( ) ;
212
+ let verbose = filter. value ( ) . saturating_sub ( default. value ( ) ) ;
213
+ let quiet = default. value ( ) . saturating_sub ( filter. value ( ) ) ;
214
+ Verbosity :: new ( verbose, quiet)
215
+ }
216
+ }
217
+
203
218
/// Customize the default log-level and associated help
204
219
pub trait LogLevel {
205
220
/// Baseline level before applying `--verbose` and `--quiet`
@@ -244,15 +259,7 @@ impl VerbosityFilter {
244
259
///
245
260
/// Negative values will decrease the verbosity, while positive values will increase it.
246
261
fn with_offset ( & self , offset : i16 ) -> VerbosityFilter {
247
- let value = match self {
248
- Self :: Off => 0_i16 ,
249
- Self :: Error => 1 ,
250
- Self :: Warn => 2 ,
251
- Self :: Info => 3 ,
252
- Self :: Debug => 4 ,
253
- Self :: Trace => 5 ,
254
- } ;
255
- match value. saturating_add ( offset) {
262
+ match i16:: from ( self . value ( ) ) . saturating_add ( offset) {
256
263
i16:: MIN ..=0 => Self :: Off ,
257
264
1 => Self :: Error ,
258
265
2 => Self :: Warn ,
@@ -261,6 +268,20 @@ impl VerbosityFilter {
261
268
5 ..=i16:: MAX => Self :: Trace ,
262
269
}
263
270
}
271
+
272
+ /// Get the numeric value of the filter.
273
+ ///
274
+ /// This is an internal representation of the filter level used only for conversion / offset.
275
+ fn value ( & self ) -> u8 {
276
+ match self {
277
+ Self :: Off => 0 ,
278
+ Self :: Error => 1 ,
279
+ Self :: Warn => 2 ,
280
+ Self :: Info => 3 ,
281
+ Self :: Debug => 4 ,
282
+ Self :: Trace => 5 ,
283
+ }
284
+ }
264
285
}
265
286
266
287
impl fmt:: Display for VerbosityFilter {
@@ -491,4 +512,24 @@ mod test {
491
512
assert_filter :: < TraceLevel > ( verbose, quiet, expected_filter) ;
492
513
}
493
514
}
515
+
516
+ #[ test]
517
+ fn from_verbosity_filter ( ) {
518
+ for & filter in & [
519
+ VerbosityFilter :: Off ,
520
+ VerbosityFilter :: Error ,
521
+ VerbosityFilter :: Warn ,
522
+ VerbosityFilter :: Info ,
523
+ VerbosityFilter :: Debug ,
524
+ VerbosityFilter :: Trace ,
525
+ ] {
526
+ assert_eq ! ( Verbosity :: <OffLevel >:: from( filter) . filter( ) , filter) ;
527
+ assert_eq ! ( Verbosity :: <ErrorLevel >:: from( filter) . filter( ) , filter) ;
528
+ assert_eq ! ( Verbosity :: <WarnLevel >:: from( filter) . filter( ) , filter) ;
529
+ assert_eq ! ( Verbosity :: <InfoLevel >:: from( filter) . filter( ) , filter) ;
530
+ assert_eq ! ( Verbosity :: <DebugLevel >:: from( filter) . filter( ) , filter) ;
531
+ assert_eq ! ( Verbosity :: <TraceLevel >:: from( filter) . filter( ) , filter) ;
532
+ }
533
+ }
534
+ }
494
535
}
0 commit comments