1use clap::{Arg, ArgAction, Command};
2
3fn main() {
4 let matches = Command::new("pacman")
5 .about("package manager utility")
6 .version("5.2.1")
7 .subcommand_required(true)
8 .arg_required_else_help(true)
9 .author("Pacman Development Team")
10 // Query subcommand
11 //
12 // Only a few of its arguments are implemented below.
13 .subcommand(
14 Command::new("query")
15 .short_flag('Q')
16 .long_flag("query")
17 .about("Query the package database.")
18 .arg(
19 Arg::new("search")
20 .short('s')
21 .long("search")
22 .help("search locally installed packages for matching strings")
23 .conflicts_with("info")
24 .action(ArgAction::Set)
25 .num_args(1..),
26 )
27 .arg(
28 Arg::new("info")
29 .long("info")
30 .short('i')
31 .conflicts_with("search")
32 .help("view package information")
33 .action(ArgAction::Set)
34 .num_args(1..),
35 ),
36 )
37 // Sync subcommand
38 //
39 // Only a few of its arguments are implemented below.
40 .subcommand(
41 Command::new("sync")
42 .short_flag('S')
43 .long_flag("sync")
44 .about("Synchronize packages.")
45 .arg(
46 Arg::new("search")
47 .short('s')
48 .long("search")
49 .conflicts_with("info")
50 .action(ArgAction::Set)
51 .num_args(1..)
52 .help("search remote repositories for matching strings"),
53 )
54 .arg(
55 Arg::new("info")
56 .long("info")
57 .conflicts_with("search")
58 .short('i')
59 .action(ArgAction::SetTrue)
60 .help("view package information"),
61 )
62 .arg(
63 Arg::new("package")
64 .help("packages")
65 .required_unless_present("search")
66 .action(ArgAction::Set)
67 .num_args(1..),
68 ),
69 )
70 .get_matches();
71
72 match matches.subcommand() {
73 Some(("sync", sync_matches)) => {
74 if sync_matches.contains_id("search") {
75 let packages: Vec<_> = sync_matches
76 .get_many::<String>("search")
77 .expect("contains_id")
78 .map(|s| s.as_str())
79 .collect();
80 let values = packages.join(", ");
81 println!("Searching for {values}...");
82 return;
83 }
84
85 let packages: Vec<_> = sync_matches
86 .get_many::<String>("package")
87 .expect("is present")
88 .map(|s| s.as_str())
89 .collect();
90 let values = packages.join(", ");
91
92 if sync_matches.get_flag("info") {
93 println!("Retrieving info for {values}...");
94 } else {
95 println!("Installing {values}...");
96 }
97 }
98 Some(("query", query_matches)) => {
99 if let Some(packages) = query_matches.get_many::<String>("info") {
100 let comma_sep = packages.map(|s| s.as_str()).collect::<Vec<_>>().join(", ");
101 println!("Retrieving info for {comma_sep}...");
102 } else if let Some(queries) = query_matches.get_many::<String>("search") {
103 let comma_sep = queries.map(|s| s.as_str()).collect::<Vec<_>>().join(", ");
104 println!("Searching Locally for {comma_sep}...");
105 } else {
106 println!("Displaying all locally installed packages...");
107 }
108 }
109 _ => unreachable!(), // If all subcommands are defined above, anything else is unreachable
110 }
111}
112