| 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") |
| .action(ArgAction::Set) |
| .num_args(1..), |
| ) |
| .arg( |
| Arg::new("info") |
| .long("info") |
| .short('i') |
| .conflicts_with("search") |
| .help("view package information") |
| .action(ArgAction::Set) |
| .num_args(1..), |
| ), |
| ) |
| // 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") |
| .action(ArgAction::Set) |
| .num_args(1..) |
| .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") |
| .action(ArgAction::Set) |
| .num_args(1..), |
| ), |
| ) |
| .get_matches(); |
| |
| match matches.subcommand() { |
| Some(("sync", sync_matches)) => { |
| if sync_matches.contains_id("search") { |
| let packages: Vec<_> = sync_matches |
| .get_many::<String>("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::<String>("package") |
| .expect("is present") |
| .map(|s| s.as_str()) |
| .collect(); |
| let values = packages.join(", "); |
| |
| if sync_matches.get_flag("info") { |
| println!("Retrieving info for {values}..."); |
| } else { |
| println!("Installing {values}..."); |
| } |
| } |
| Some(("query", query_matches)) => { |
| if let Some(packages) = query_matches.get_many::<String>("info") { |
| let comma_sep = packages.map(|s| s.as_str()).collect::<Vec<_>>().join(", "); |
| println!("Retrieving info for {comma_sep}..."); |
| } else if let Some(queries) = query_matches.get_many::<String>("search") { |
| let comma_sep = queries.map(|s| s.as_str()).collect::<Vec<_>>().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 |
| } |
| } |