structopt_flags/
verbose.rs

1use 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    /// Increase the output's verbosity level (default:info)
14    /// Pass many times to increase verbosity level, up to 4.
15    #[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    /// Increase the output's verbosity level
46    /// Pass many times to increase verbosity level.
47    #[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    /// Increase the output's verbosity level
93    /// Pass many times to increase verbosity level, up to 3.
94    #[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    /// Decrease the output's verbosity level
105    /// Used once, it will set error log level.
106    /// Used twice, will slient the log completely
107    #[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    /// Enable the verbose output
150    /// No multiple occurrences are supported
151    #[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}