use crate::commands::*;
use crate::logging::setup_logger;
use clap::{Parser, Subcommand};
use log::{debug, error};
use std::process;
#[derive(Parser)]
#[command(version, author, about, long_about = None, arg_required_else_help = true)]
struct Cli {
#[command(subcommand)]
command: Commands,
}
#[derive(Subcommand)]
enum Commands {
Info,
List {
name: Option<String>,
#[arg(long, short)]
verbose: bool,
},
#[command(alias = "install")]
Add {
name: String,
#[arg(default_value = "latest")]
version: String,
#[arg(long, short)]
set_default: bool,
},
#[command(alias = "uninstall")]
Remove {
name: String,
version: Option<String>,
},
#[command(alias = "set")]
Use {
name: String,
version: String,
},
#[command(disable_help_flag = true)]
Run {
name: String,
#[arg(trailing_var_arg = true, allow_hyphen_values = true)]
subcommand: Vec<String>,
},
#[command(alias = "configure")]
Config {
path: String,
value: Option<String>,
},
}
pub fn run() {
if let Err(e) = setup_logger() {
eprintln!("Could not setup logger: {}", e);
process::exit(1);
}
debug!(
"hbox {}",
std::env::args().skip(1).collect::<Vec<String>>().join(" ")
);
let cli = Cli::parse();
let result = match &cli.command {
Commands::Info => show_info(),
Commands::List { name, verbose } => list_packages(name.as_deref(), *verbose),
Commands::Add {
name,
version,
set_default,
} => add_package(name.clone(), version.clone(), *set_default),
Commands::Remove { name, version } => remove_package(name.clone(), version.clone()),
Commands::Use { name, version } => use_package_version(name.clone(), version.clone()),
Commands::Run { name, subcommand } => run_package(name.clone(), subcommand.clone()),
Commands::Config { path, value } => configure_setting(path.clone(), value.clone()),
};
if let Err(e) = result {
error!("{}", e);
process::exit(1);
}
}
#[test]
fn verify_cli() {
use clap::CommandFactory;
Cli::command().debug_assert()
}