Compare commits

...

2 commits

Author SHA1 Message Date
c6afa063ef docs(cli): example for a simple cli
All checks were successful
cargo devel CI / cargo CI (push) Successful in 2m8s
2024-06-29 17:05:50 +02:00
74aaeb0ec2 refactor(cli): verbosity level no option anymore, prevent verbosity overflows 2024-06-29 17:05:37 +02:00
2 changed files with 51 additions and 17 deletions

View file

@ -0,0 +1,41 @@
use clap::Parser;
use libpt_cli::args::VerbosityLevel;
use libpt_cli::{clap, printing};
use libpt_log::{debug, Logger};
/// This is the help
///
/// This is more help
#[derive(Parser, Debug)]
struct Cli {
// already has documentation
#[command(flatten)]
verbosity: VerbosityLevel,
/// texts to be echoed
#[arg(required = true)]
text: Vec<String>,
/// try to be more machine readable
#[arg(short, long)]
machine: bool,
}
fn main() {
let cli = Cli::parse();
let _logger = Logger::builder()
.max_level(cli.verbosity.level())
.show_time(false)
.build();
debug!("logger initialized with level: {}", cli.verbosity.level());
if !cli.machine {
let text = cli.text.join(" ");
printing::blockprint(text, console::Color::Green);
} else {
for text in cli.text {
println!("{text}")
}
}
}

View file

@ -94,9 +94,9 @@ Author: {author-with-newline}
/// ///
/// // Level might be None if the user wants no output at all. /// // Level might be None if the user wants no output at all.
/// // for the 'tracing' level: /// // for the 'tracing' level:
/// let level: Option<Level> = opts.verbose.level(); /// let level: Level = opts.verbose.level();
/// // for the 'log' level: /// // for the 'log' level:
/// let llevel: Option<log::Level> = opts.verbose.level_for_log_crate(); /// let llevel: log::Level = opts.verbose.level_for_log_crate();
/// } /// }
/// ``` /// ```
#[derive(Parser, Clone, PartialEq, Eq, Hash)] #[derive(Parser, Clone, PartialEq, Eq, Hash)]
@ -134,27 +134,20 @@ impl VerbosityLevel {
} }
#[inline] #[inline]
fn value(&self) -> i8 { fn value(&self) -> i8 {
let v = Self::level_value(Level::INFO) - (self.quiet as i8) + (self.verbose as i8); Self::level_value(Level::INFO) - (self.quiet as i8).min(10) + (self.verbose as i8).min(10)
if v > Self::level_value(Level::TRACE) {
Self::level_value(Level::TRACE)
} else {
v
}
} }
/// get the [Level] for that VerbosityLevel /// get the [Level] for that VerbosityLevel
///
/// [None] means that absolutely no output is wanted (completely quiet)
#[inline] #[inline]
pub fn level(&self) -> Option<Level> { pub fn level(&self) -> Level {
Some(match self.value() { match self.value() {
0 => Level::ERROR, 0 => Level::ERROR,
1 => Level::WARN, 1 => Level::WARN,
2 => Level::INFO, 2 => Level::INFO,
3 => Level::DEBUG, 3 => Level::DEBUG,
4 => Level::TRACE, 4 => Level::TRACE,
_ => return None, _ => Level::ERROR,
}) }
} }
/// get the [log::Level] for that VerbosityLevel /// get the [log::Level] for that VerbosityLevel
@ -163,14 +156,14 @@ impl VerbosityLevel {
/// ///
/// [None] means that absolutely no output is wanted (completely quiet) /// [None] means that absolutely no output is wanted (completely quiet)
#[inline] #[inline]
pub fn level_for_log_crate(&self) -> Option<log::Level> { pub fn level_for_log_crate(&self) -> log::Level {
self.level().map(|ll| match ll { match self.level() {
Level::TRACE => log::Level::Trace, Level::TRACE => log::Level::Trace,
Level::DEBUG => log::Level::Debug, Level::DEBUG => log::Level::Debug,
Level::INFO => log::Level::Info, Level::INFO => log::Level::Info,
Level::WARN => log::Level::Warn, Level::WARN => log::Level::Warn,
Level::ERROR => log::Level::Error, Level::ERROR => log::Level::Error,
}) }
} }
#[inline] #[inline]