1use clap::Parser;
2use tracing::level_filters::LevelFilter;
3use tracing_subscriber::EnvFilter;
4
5#[derive(Parser, Clone, Default)]
6pub struct Args {
7 #[arg(long, short, action = clap::ArgAction::Count)]
8 pub verbose: u8,
9
10 #[arg(long, short, action = clap::ArgAction::Count, conflicts_with = "verbose")]
11 pub quiet: u8,
12}
13
14impl Args {
15 pub fn level(&self) -> LevelFilter {
16 match self.verbose {
18 0 => match self.quiet {
19 0 => LevelFilter::INFO,
20 1 => LevelFilter::ERROR,
21 _ => LevelFilter::OFF,
22 },
23 1 => LevelFilter::DEBUG,
24 _ => LevelFilter::TRACE,
25 }
26 }
27
28 pub fn init(&self) {
29 let filter = EnvFilter::builder()
30 .with_default_directive(self.level().into()) .from_env_lossy() .add_directive("h2=warn".parse().unwrap())
33 .add_directive("quinn=info".parse().unwrap())
34 .add_directive("tracing::span=off".parse().unwrap())
35 .add_directive("tracing::span::active=off".parse().unwrap());
36
37 let logger = tracing_subscriber::FmtSubscriber::builder()
38 .with_writer(std::io::stderr)
39 .with_env_filter(filter)
40 .finish();
41
42 tracing::subscriber::set_global_default(logger).unwrap();
43 }
44}