1mod run;
2
3use clap::{Parser, Subcommand};
4use clap_verbosity_flag::{InfoLevel, Verbosity};
5
6use crate::contrib;
7
8#[derive(Parser)]
9#[command(version, about, long_about = None, disable_help_subcommand = true, styles = contrib::clap::styles())]
10struct Cli {
11 #[command(subcommand)]
12 command: Commands,
13
14 #[command(flatten, next_display_order = 100)]
15 verbose: Verbosity<InfoLevel>,
16}
17
18#[derive(Subcommand)]
19enum Commands {
20 Run(run::RunCommand),
22}
23
24pub fn execute() -> i32 {
25 let cli = Cli::parse();
26
27 let level_filter = cli.verbose.log_level_filter();
28 let debugging = level_filter >= log::LevelFilter::Debug;
29 let timestamp: Option<env_logger::fmt::TimestampPrecision> = if debugging {
30 Some(env_logger::fmt::TimestampPrecision::Seconds)
31 } else {
32 None
33 };
34 env_logger::builder()
35 .format_level(debugging)
36 .format_target(false)
37 .format_timestamp(timestamp)
38 .filter_level(level_filter)
39 .init();
40
41 let r = match &cli.command {
42 Commands::Run(cmd) => cmd.execute(),
43 };
44
45 if let Err(err) = r {
46 log::error!("{}", format!("{}", err));
47 1
48 } else {
49 r.unwrap()
50 }
51}