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 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)
}
}