extern crate clap; use clap::{App, Arg, SubCommand}; fn main() { // This method shows the traditional, and slightly more configurable way to set up arguments. This method is // more verbose, but allows setting more configuration options, and even supports easier dynamic generation. // // The example below is functionally identical to the one in 01a_QuickExample.rs // // *NOTE:* You can actually achieve the best of both worlds by using Arg::from_usage() (instead of Arg::with_name()) // and *then* setting any additional properties. // // Create an application with 5 possible arguments (2 auto generated) and 2 subcommands (1 auto generated) // - A config file // + Uses "-c filename" or "--config filename" // - An output file // + A positional argument (i.e. "$ myapp output_filename") // - A debug flag // + Uses "-d" or "--debug" // + Allows multiple occurrences of such as "-dd" (for vary levels of debugging, as an example) // - A help flag (automatically generated by clap) // + Uses "-h" or "--help" (Only autogenerated if you do NOT specify your own "-h" or "--help") // - A version flag (automatically generated by clap) // + Uses "-V" or "--version" (Only autogenerated if you do NOT specify your own "-V" or "--version") // - A subcommand "test" (subcommands behave like their own apps, with their own arguments // + Used by "$ myapp test" with the following arguments // > A list flag // = Uses "-l" (usage is "$ myapp test -l" // > A help flag (automatically generated by clap // = Uses "-h" or "--help" (full usage "$ myapp test -h" or "$ myapp test --help") // > A version flag (automatically generated by clap // = Uses "-V" or "--version" (full usage "$ myapp test -V" or "$ myapp test --version") // - A subcommand "help" (automatically generated by clap because we specified a subcommand of our own) // + Used by "$ myapp help" (same functionality as "-h" or "--help") let matches = App::new("MyApp") .version("1.0") .author("Kevin K. ") .about("Does awesome things") .arg(Arg::with_name("config") .short("c") .long("config") .help("Sets a custom config file") .takes_value(true)) .arg(Arg::with_name("output") .help("Sets an optional output file") .index(1)) .arg(Arg::with_name("debug") .short("d") .multiple(true) .help("Turn debugging information on")) .subcommand(SubCommand::with_name("test") .about("does testing things") .arg(Arg::with_name("list") .short("l") .help("lists test values"))) .get_matches(); // You can check the value provided by positional arguments, or option arguments if let Some(o) = matches.value_of("output") { println!("Value for output: {}", o); } if let Some(c) = matches.value_of("config") { println!("Value for config: {}", c); } // You can see how many times a particular flag or argument occurred // Note, only flags can have multiple occurrences match matches.occurrences_of("debug") { 0 => println!("Debug mode is off"), 1 => println!("Debug mode is kind of on"), 2 => println!("Debug mode is on"), 3 | _ => 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 if let Some(ref matches) = matches.subcommand_matches("test") { // "$ myapp test" was run if matches.is_present("list") { // "$ myapp test -l" was run println!("Printing testing lists..."); } else { println!("Not printing testing lists..."); } } // Continued program logic goes here... }