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 )
// 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
}
}
Messung V0.5 in Prozent C=77 H=95 G=86
¤ Dauer der Verarbeitung: 0.9 Sekunden
(vorverarbeitet am 2026-06-19)
¤
*© Formatika GbR, Deutschland