hakoniwa_cli/
cli.rs

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 a COMMAND in a container
21    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}