use clap::ArgMatches; const DEPS: &[&str] = &["gh", "fzf"]; // -- List // pub fn ls() -> clap::Command { clap::Command::new("ls") } pub fn ls_exec() -> eyre::Result<()> { println!("Required packages\n---"); let mut deps: Vec<&str> = DEPS.into_iter().map(|d| d.clone()).collect(); deps.sort(); for dep in deps { println!("{}", dep) } Ok(()) } // -- Prereqs // pub fn prereqs() -> eyre::Result { let cmd = clap::Command::new("prereqs").subcommands([ls()]); Ok(cmd) } pub fn prereqs_exec(matches: &ArgMatches) -> eyre::Result<()> { match matches.subcommand() { Some(("ls", _)) => ls_exec(), _ => Err(eyre::anyhow!("not implemented")), } }