mirror of
				https://github.com/mozilla/gecko-dev.git
				synced 2025-11-04 10:18:41 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			111 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			111 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
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
 | 
						|
    }
 | 
						|
}
 |