Skip to main content

#
busybox/
multicall-busybox.rs

    1use std::path::PathBuf;
    2use std::process::exit;
    3
    4use clap::{Arg, ArgAction, Command, value_parser};
    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}