1use anyhow::Result;
2use clap::{ArgAction, Args};
3use std::io::stderr;
4use tracing::Level;
5
6#[derive(Args)]
7#[command(about = None)]
8pub struct Verbosity {
9 #[clap(long, action = ArgAction::Count, global = true)]
11 verbose: u8,
12
13 #[clap(long, global = true, conflicts_with = "verbose")]
15 quiet: bool,
16}
17
18impl Verbosity {
19 fn get_level(&self) -> Level {
20 if self.quiet {
21 Level::ERROR
22 } else {
23 match self.verbose {
24 0 => Level::INFO,
25 1 => Level::DEBUG,
26 _ => Level::TRACE,
27 }
28 }
29 }
30}
31
32pub fn setup_logging(verbose: &Verbosity) -> Result<()> {
33 let filter = if let Ok(x) = tracing_subscriber::EnvFilter::try_from_default_env() {
34 x
35 } else {
36 tracing_subscriber::EnvFilter::builder().parse(verbose.get_level().as_str())?
37 };
38
39 tracing_subscriber::fmt()
40 .with_env_filter(filter)
41 .with_writer(stderr)
42 .try_init()
43 .ok();
44
45 Ok(())
46}