Skip to content

Commit 41425bb

Browse files
authored
Merge pull request #115 from joshka/jm/verbosity-u8
Use u8 for internal verbosity level calculation
2 parents c621a6a + 9936958 commit 41425bb

File tree

1 file changed

+114
-16
lines changed

1 file changed

+114
-16
lines changed

src/lib.rs

+114-16
Original file line numberDiff line numberDiff line change
@@ -126,30 +126,32 @@ impl<L: LogLevel> Verbosity<L> {
126126
self.log_level().is_none()
127127
}
128128

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
131133
}
132134
}
133135

134-
fn level_value(level: Option<Level>) -> i8 {
136+
fn level_value(level: Option<Level>) -> u8 {
135137
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,
142144
}
143145
}
144146

145-
fn level_enum(verbosity: i8) -> Option<Level> {
147+
fn level_enum(verbosity: u8) -> Option<Level> {
146148
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),
153155
}
154156
}
155157

@@ -235,4 +237,100 @@ mod test {
235237
use clap::CommandFactory;
236238
Cli::command().debug_assert();
237239
}
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+
}
238336
}

0 commit comments

Comments
 (0)