@@ -126,30 +126,32 @@ impl<L: LogLevel> Verbosity<L> {
126
126
self . log_level ( ) . is_none ( )
127
127
}
128
128
129
- fn verbosity ( & self ) -> i8 {
130
- level_value ( L :: default ( ) ) - ( self . quiet as i8 ) + ( self . verbose as i8 )
129
+ fn verbosity ( & self ) -> u8 {
130
+ let default_verbosity = level_value ( L :: default ( ) ) ;
131
+ let verbosity = default_verbosity as i16 - self . quiet as i16 + self . verbose as i16 ;
132
+ verbosity. clamp ( 0 , u8:: MAX as i16 ) as u8
131
133
}
132
134
}
133
135
134
- fn level_value ( level : Option < Level > ) -> i8 {
136
+ fn level_value ( level : Option < Level > ) -> u8 {
135
137
match level {
136
- None => - 1 ,
137
- Some ( Level :: Error ) => 0 ,
138
- Some ( Level :: Warn ) => 1 ,
139
- Some ( Level :: Info ) => 2 ,
140
- Some ( Level :: Debug ) => 3 ,
141
- Some ( Level :: Trace ) => 4 ,
138
+ None => 0 ,
139
+ Some ( Level :: Error ) => 1 ,
140
+ Some ( Level :: Warn ) => 2 ,
141
+ Some ( Level :: Info ) => 3 ,
142
+ Some ( Level :: Debug ) => 4 ,
143
+ Some ( Level :: Trace ) => 5 ,
142
144
}
143
145
}
144
146
145
- fn level_enum ( verbosity : i8 ) -> Option < Level > {
147
+ fn level_enum ( verbosity : u8 ) -> Option < Level > {
146
148
match verbosity {
147
- i8 :: MIN ..=- 1 => None ,
148
- 0 => Some ( Level :: Error ) ,
149
- 1 => Some ( Level :: Warn ) ,
150
- 2 => Some ( Level :: Info ) ,
151
- 3 => Some ( Level :: Debug ) ,
152
- 4 ..=i8 :: MAX => Some ( Level :: Trace ) ,
149
+ 0 => None ,
150
+ 1 => Some ( Level :: Error ) ,
151
+ 2 => Some ( Level :: Warn ) ,
152
+ 3 => Some ( Level :: Info ) ,
153
+ 4 => Some ( Level :: Debug ) ,
154
+ 5 ..=u8 :: MAX => Some ( Level :: Trace ) ,
153
155
}
154
156
}
155
157
@@ -235,4 +237,100 @@ mod test {
235
237
use clap:: CommandFactory ;
236
238
Cli :: command ( ) . debug_assert ( ) ;
237
239
}
240
+
241
+ #[ test]
242
+ fn verbosity_error_level ( ) {
243
+ let tests = [
244
+ // verbose, quiet, expected_level, expected_filter
245
+ ( 0 , 0 , Some ( Level :: Error ) , LevelFilter :: Error ) ,
246
+ ( 1 , 0 , Some ( Level :: Warn ) , LevelFilter :: Warn ) ,
247
+ ( 2 , 0 , Some ( Level :: Info ) , LevelFilter :: Info ) ,
248
+ ( 3 , 0 , Some ( Level :: Debug ) , LevelFilter :: Debug ) ,
249
+ ( 4 , 0 , Some ( Level :: Trace ) , LevelFilter :: Trace ) ,
250
+ ( 5 , 0 , Some ( Level :: Trace ) , LevelFilter :: Trace ) ,
251
+ ( 255 , 0 , Some ( Level :: Trace ) , LevelFilter :: Trace ) ,
252
+ ( 0 , 1 , None , LevelFilter :: Off ) ,
253
+ ( 0 , 2 , None , LevelFilter :: Off ) ,
254
+ ( 0 , 255 , None , LevelFilter :: Off ) ,
255
+ ( 255 , 255 , Some ( Level :: Error ) , LevelFilter :: Error ) ,
256
+ ] ;
257
+
258
+ for ( verbose, quiet, expected_level, expected_filter) in tests. iter ( ) {
259
+ let v = Verbosity :: < ErrorLevel > :: new ( * verbose, * quiet) ;
260
+ assert_eq ! (
261
+ v. log_level( ) ,
262
+ * expected_level,
263
+ "verbose = {verbose}, quiet = {quiet}"
264
+ ) ;
265
+ assert_eq ! (
266
+ v. log_level_filter( ) ,
267
+ * expected_filter,
268
+ "verbose = {verbose}, quiet = {quiet}"
269
+ ) ;
270
+ }
271
+ }
272
+
273
+ #[ test]
274
+ fn verbosity_warn_level ( ) {
275
+ let tests = [
276
+ // verbose, quiet, expected_level, expected_filter
277
+ ( 0 , 0 , Some ( Level :: Warn ) , LevelFilter :: Warn ) ,
278
+ ( 1 , 0 , Some ( Level :: Info ) , LevelFilter :: Info ) ,
279
+ ( 2 , 0 , Some ( Level :: Debug ) , LevelFilter :: Debug ) ,
280
+ ( 3 , 0 , Some ( Level :: Trace ) , LevelFilter :: Trace ) ,
281
+ ( 4 , 0 , Some ( Level :: Trace ) , LevelFilter :: Trace ) ,
282
+ ( 255 , 0 , Some ( Level :: Trace ) , LevelFilter :: Trace ) ,
283
+ ( 0 , 1 , Some ( Level :: Error ) , LevelFilter :: Error ) ,
284
+ ( 0 , 2 , None , LevelFilter :: Off ) ,
285
+ ( 0 , 3 , None , LevelFilter :: Off ) ,
286
+ ( 0 , 255 , None , LevelFilter :: Off ) ,
287
+ ( 255 , 255 , Some ( Level :: Warn ) , LevelFilter :: Warn ) ,
288
+ ] ;
289
+
290
+ for ( verbose, quiet, expected_level, expected_filter) in tests. iter ( ) {
291
+ let v = Verbosity :: < WarnLevel > :: new ( * verbose, * quiet) ;
292
+ assert_eq ! (
293
+ v. log_level( ) ,
294
+ * expected_level,
295
+ "verbose = {verbose}, quiet = {quiet}"
296
+ ) ;
297
+ assert_eq ! (
298
+ v. log_level_filter( ) ,
299
+ * expected_filter,
300
+ "verbose = {verbose}, quiet = {quiet}"
301
+ ) ;
302
+ }
303
+ }
304
+
305
+ #[ test]
306
+ fn verbosity_info_level ( ) {
307
+ let tests = [
308
+ // verbose, quiet, expected_level, expected_filter
309
+ ( 0 , 0 , Some ( Level :: Info ) , LevelFilter :: Info ) ,
310
+ ( 1 , 0 , Some ( Level :: Debug ) , LevelFilter :: Debug ) ,
311
+ ( 2 , 0 , Some ( Level :: Trace ) , LevelFilter :: Trace ) ,
312
+ ( 3 , 0 , Some ( Level :: Trace ) , LevelFilter :: Trace ) ,
313
+ ( 255 , 0 , Some ( Level :: Trace ) , LevelFilter :: Trace ) ,
314
+ ( 0 , 1 , Some ( Level :: Warn ) , LevelFilter :: Warn ) ,
315
+ ( 0 , 2 , Some ( Level :: Error ) , LevelFilter :: Error ) ,
316
+ ( 0 , 3 , None , LevelFilter :: Off ) ,
317
+ ( 0 , 4 , None , LevelFilter :: Off ) ,
318
+ ( 0 , 255 , None , LevelFilter :: Off ) ,
319
+ ( 255 , 255 , Some ( Level :: Info ) , LevelFilter :: Info ) ,
320
+ ] ;
321
+
322
+ for ( verbose, quiet, expected_level, expected_filter) in tests. iter ( ) {
323
+ let v = Verbosity :: < InfoLevel > :: new ( * verbose, * quiet) ;
324
+ assert_eq ! (
325
+ v. log_level( ) ,
326
+ * expected_level,
327
+ "verbose = {verbose}, quiet = {quiet}"
328
+ ) ;
329
+ assert_eq ! (
330
+ v. log_level_filter( ) ,
331
+ * expected_filter,
332
+ "verbose = {verbose}, quiet = {quiet}"
333
+ ) ;
334
+ }
335
+ }
238
336
}
0 commit comments