Skip to main content

#
01_quick_derive/
01_quick.rs

    1use std::path::PathBuf;
    2
    3use clap::{Parser, Subcommand};
    4
    5#[derive(Parser)]
    6#[command(version, about, long_about = None)]
    7struct Cli {
    8    /// Optional name to operate on
    9    name: Option<String>,
    10
    11    /// Sets a custom config file
    12    #[arg(short, long, value_name = "FILE")]
    13    config: Option<PathBuf>,
    14
    15    /// Turn debugging information on
    16    #[arg(short, long, action = clap::ArgAction::Count)]
    17    debug: u8,
    18
    19    #[command(subcommand)]
    20    command: Option<Commands>,
    21}
    22
    23#[derive(Subcommand)]
    24enum Commands {
    25    /// does testing things
    26    Test {
    27        /// lists test values
    28        #[arg(short, long)]
    29        list: bool,
    30    },
    31}
    32
    33fn main() {
    34    let cli = Cli::parse();
    35
    36    // You can check the value provided by positional arguments, or option arguments
    37    if let Some(name) = cli.name.as_deref() {
    38        println!("Value for name: {name}");
    39    }
    40
    41    if let Some(config_path) = cli.config.as_deref() {
    42        println!("Value for config: {}", config_path.display());
    43    }
    44
    45    // You can see how many times a particular flag or argument occurred
    46    // Note, only flags can have multiple occurrences
    47    match cli.debug {
    48        0 => println!("Debug mode is off"),
    49        1 => println!("Debug mode is kind of on"),
    50        2 => println!("Debug mode is on"),
    51        _ => println!("Don't be crazy"),
    52    }
    53
    54    // You can check for the existence of subcommands, and if found use their
    55    // matches just as you would the top level cmd
    56    match &cli.command {
    57        Some(Commands::Test { list }) => {
    58            if *list {
    59                println!("Printing testing lists...");
    60            } else {
    61                println!("Not printing testing lists...");
    62            }
    63        }
    64        None => {}
    65    }
    66
    67    // Continued program logic goes here...
    68}