structopt_flags/
verbose.rs1use crate::{GetWithDefault, LogLevel};
2use log::LevelFilter;
3use std::fmt;
4use structopt::StructOpt;
5
6#[cfg(feature = "simplelog")]
7use crate::SetLogWithDefault;
8#[cfg(feature = "simplelog")]
9use simplelog::{Config, TermLogger, TerminalMode};
10#[derive(StructOpt, Debug, Clone)]
11
12pub struct Verbose {
13 #[structopt(
16 name = "verbose",
17 long = "verbose",
18 short = "v",
19 parse(from_occurrences),
20 global = true
21 )]
22 verbosity_level: u8,
23}
24
25impl LogLevel for Verbose {
26 fn get_level_filter(&self) -> LevelFilter {
27 match self.verbosity_level {
28 0 => LevelFilter::Error,
29 1 => LevelFilter::Warn,
30 2 => LevelFilter::Info,
31 3 => LevelFilter::Debug,
32 _ => LevelFilter::Trace,
33 }
34 }
35}
36
37impl fmt::Display for Verbose {
38 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
39 write!(f, "{}", self.get_level_filter())
40 }
41}
42
43#[derive(StructOpt, Debug, Clone)]
44pub struct VerboseNoDef {
45 #[structopt(
48 name = "verbose",
49 long = "verbose",
50 short = "v",
51 parse(from_occurrences),
52 global = true
53 )]
54 verbosity_level: u8,
55}
56
57impl GetWithDefault for VerboseNoDef {
58 type Item = LevelFilter;
59 fn get_with_default<T: Into<Self::Item>>(&self, default: T) -> Self::Item {
60 let default_value: i8 = match default.into() {
61 LevelFilter::Off => -1,
62 LevelFilter::Error => 0,
63 LevelFilter::Warn => 1,
64 LevelFilter::Info => 2,
65 LevelFilter::Debug => 3,
66 LevelFilter::Trace => 4,
67 };
68
69 match default_value + self.verbosity_level as i8 {
70 -1 => LevelFilter::Off,
71 0 => LevelFilter::Error,
72 1 => LevelFilter::Warn,
73 2 => LevelFilter::Info,
74 3 => LevelFilter::Debug,
75 _ => LevelFilter::Trace,
76 }
77 }
78}
79#[cfg(feature = "simplelog")]
80impl SetLogWithDefault for VerboseNoDef {
81 fn set_with_default(&self, default: LevelFilter) {
82 TermLogger::init(
83 self.get_with_default(default),
84 Config::default(),
85 TerminalMode::Mixed,
86 )
87 .unwrap_or(());
88 }
89}
90#[derive(StructOpt, Debug, Clone)]
91pub struct QuietVerbose {
92 #[structopt(
95 name = "quietverbose",
96 long = "verbose",
97 short = "v",
98 parse(from_occurrences),
99 conflicts_with = "quietquiet",
100 global = true
101 )]
102 verbosity_level: u8,
103
104 #[structopt(
108 name = "quietquiet",
109 long = "quiet",
110 short = "q",
111 parse(from_occurrences),
112 conflicts_with = "quietverbose",
113 global = true
114 )]
115 quiet_level: u8,
116}
117
118impl LogLevel for QuietVerbose {
119 fn get_level_filter(&self) -> LevelFilter {
120 let quiet: i8 = if self.quiet_level > 1 {
121 2
122 } else {
123 self.quiet_level as i8
124 };
125 let verbose: i8 = if self.verbosity_level > 2 {
126 3
127 } else {
128 self.verbosity_level as i8
129 };
130 match verbose - quiet {
131 -2 => LevelFilter::Off,
132 -1 => LevelFilter::Error,
133 0 => LevelFilter::Warn,
134 1 => LevelFilter::Info,
135 2 => LevelFilter::Debug,
136 _ => LevelFilter::Trace,
137 }
138 }
139}
140
141impl fmt::Display for QuietVerbose {
142 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
143 write!(f, "{}", self.get_level_filter())
144 }
145}
146
147#[derive(StructOpt, Debug, Clone)]
148pub struct SimpleVerbose {
149 #[structopt(name = "simpleverbose", long = "verbose", short = "v", global = true)]
152 pub verbose: bool,
153}
154
155impl fmt::Display for SimpleVerbose {
156 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
157 if self.verbose {
158 write!(f, "True")
159 } else {
160 write!(f, "False")
161 }
162 }
163}