use clap::{Arg, ArgAction, Command}; fn main() { let matches = Command::new("pacman") .about("package manager utility") .version("5.2.1") .subcommand_required(true) .arg_required_else_help(true) .author("Pacman Development Team") // Query subcommand // // Only a few of its arguments are implemented below. .subcommand( Command::new("query") .short_flag('Q') .long_flag("query") .about("Query the package database.") .arg( Arg::new("search") .short('s') .long("search") .help("search locally installed packages for matching strings") .conflicts_with("info") .takes_value(true) .multiple_values(true), ) .arg( Arg::new("info") .long("info") .short('i') .conflicts_with("search") .help("view package information") .takes_value(true) .multiple_values(true), ), ) // Sync subcommand // // Only a few of its arguments are implemented below. .subcommand( Command::new("sync") .short_flag('S') .long_flag("sync") .about("Synchronize packages.") .arg( Arg::new("search") .short('s') .long("search") .conflicts_with("info") .takes_value(true) .multiple_values(true) .help("search remote repositories for matching strings"), ) .arg( Arg::new("info") .long("info") .conflicts_with("search") .short('i') .action(ArgAction::SetTrue) .help("view package information"), ) .arg( Arg::new("package") .help("packages") .required_unless_present("search") .takes_value(true) .multiple_values(true), ), ) .get_matches(); match matches.subcommand() { Some(("sync", sync_matches)) => { if sync_matches.contains_id("search") { let packages: Vec<_> = sync_matches .get_many::("search") .expect("contains_id") .map(|s| s.as_str()) .collect(); let values = packages.join(", "); println!("Searching for {}...", values); return; } let packages: Vec<_> = sync_matches .get_many::("package") .expect("is present") .map(|s| s.as_str()) .collect(); let values = packages.join(", "); if *sync_matches .get_one::("info") .expect("defaulted by clap") { println!("Retrieving info for {}...", values); } else { println!("Installing {}...", values); } } Some(("query", query_matches)) => { if let Some(packages) = query_matches.get_many::("info") { let comma_sep = packages.map(|s| s.as_str()).collect::>().join(", "); println!("Retrieving info for {}...", comma_sep); } else if let Some(queries) = query_matches.get_many::("search") { let comma_sep = queries.map(|s| s.as_str()).collect::>().join(", "); println!("Searching Locally for {}...", comma_sep); } else { println!("Displaying all locally installed packages..."); } } _ => unreachable!(), // If all subcommands are defined above, anything else is unreachable } }