1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
use log::Level;
#[derive(structopt::StructOpt, Debug, Clone)]
pub struct Verbosity {
#[structopt(long, short = "v", parse(from_occurrences))]
verbose: i8,
#[structopt(long, short = "q", parse(from_occurrences), conflicts_with = "verbose")]
quiet: i8,
#[structopt(skip)]
default: i8,
}
impl Verbosity {
pub fn new(verbose: i8, quiet: i8, default: i8) -> Verbosity {
Verbosity {
verbose,
quiet,
default,
}
}
pub fn set_default(&mut self, level: Option<Level>) {
self.default = level_value(level);
}
pub fn log_level(&self) -> Option<Level> {
level_enum(self.verbosity())
}
pub fn is_silent(&self) -> bool {
self.log_level().is_none()
}
fn verbosity(&self) -> i8 {
self.default - self.quiet + self.verbose
}
}
fn level_value(level: Option<Level>) -> i8 {
match level {
None => -1,
Some(log::Level::Error) => 0,
Some(log::Level::Warn) => 1,
Some(log::Level::Info) => 2,
Some(log::Level::Debug) => 3,
Some(log::Level::Trace) => 4,
}
}
fn level_enum(verbosity: i8) -> Option<Level> {
match verbosity {
std::i8::MIN..=-1 => None,
0 => Some(log::Level::Error),
1 => Some(log::Level::Warn),
2 => Some(log::Level::Info),
3 => Some(log::Level::Debug),
4..=std::i8::MAX => Some(log::Level::Trace),
}
}
use std::fmt;
impl fmt::Display for Verbosity {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.verbose)
}
}