use std::path::PathBuf; use clap::{Parser, Subcommand}; #[derive(Parser)] #[clap(author, version, about)] struct Cli { /// Optional name to operate on name: Option, /// Sets a custom config file #[clap(short, long, parse(from_os_str), value_name = "FILE")] config: Option, /// Turn debugging information on #[clap(short, long, parse(from_occurrences))] debug: usize, #[clap(subcommand)] command: Option, } #[derive(Subcommand)] enum Commands { /// does testing things Test { /// lists test values #[clap(short, long)] list: bool, }, } fn main() { let cli = Cli::parse(); // You can check the value provided by positional arguments, or option arguments if let Some(name) = cli.name.as_deref() { println!("Value for name: {}", name); } if let Some(config_path) = cli.config.as_deref() { println!("Value for config: {}", config_path.display()); } // You can see how many times a particular flag or argument occurred // Note, only flags can have multiple occurrences match cli.debug { 0 => println!("Debug mode is off"), 1 => println!("Debug mode is kind of on"), 2 => println!("Debug mode is on"), _ => println!("Don't be crazy"), } // You can check for the existence of subcommands, and if found use their // matches just as you would the top level app match &cli.command { Some(Commands::Test { list }) => { if *list { println!("Printing testing lists..."); } else { println!("Not printing testing lists..."); } } None => {} } // Continued program logic goes here... }