mirror of
https://github.com/clap-rs/clap
synced 2024-12-12 13:52:34 +00:00
eda0ca54c1
Clap has focused on reporting development errors through assertions rather than mixing user errors with development errors. Sometimes, developers need to handle things more flexibly so included in #3732 was the reporting of value accessor failures as internal errors with a distinct type. I've been going back and forth on whether the extra error pessimises the usability in the common case vs dealing with the proliferation of different function combinations. In working on deprecating the `value_of` functions, I decided that it was going to be worth duplicating so long as we can keep the documentation focused.
110 lines
4.1 KiB
Rust
110 lines
4.1 KiB
Rust
use clap::{Arg, 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')
|
|
.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.is_present("search") {
|
|
let packages: Vec<_> = sync_matches
|
|
.get_many::<String>("search")
|
|
.expect("is present")
|
|
.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.is_present("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
|
|
}
|
|
}
|