1use std::path::PathBuf; 2use std::process::exit; 3 4use clap::{value_parser, Arg, ArgAction, Command}; 5 6fn applet_commands() -> [Command; 2] { 7 [ 8 Command::new("true").about("does nothing successfully"), 9 Command::new("false").about("does nothing unsuccessfully"), 10 ] 11} 12 13fn main() { 14 let cmd = Command::new(env!("CARGO_CRATE_NAME")) 15 .multicall(true) 16 .subcommand( 17 Command::new("busybox") 18 .arg_required_else_help(true) 19 .subcommand_value_name("APPLET") 20 .subcommand_help_heading("APPLETS") 21 .arg( 22 Arg::new("install") 23 .long("install") 24 .help("Install hardlinks for all subcommands in path") 25 .exclusive(true) 26 .action(ArgAction::Set) 27 .default_missing_value("/usr/local/bin") 28 .value_parser(value_parser!(PathBuf)), 29 ) 30 .subcommands(applet_commands()), 31 ) 32 .subcommands(applet_commands()); 33 34 let matches = cmd.get_matches(); 35 let mut subcommand = matches.subcommand(); 36 if let Some(("busybox", cmd)) = subcommand { 37 if cmd.contains_id("install") { 38 unimplemented!("Make hardlinks to the executable here"); 39 } 40 subcommand = cmd.subcommand(); 41 } 42 match subcommand { 43 Some(("false", _)) => exit(1), 44 Some(("true", _)) => exit(0), 45 _ => unreachable!("parser should ensure only valid subcommand names are used"), 46 } 47} 48