Skip to content
>_devvkit
$devvkit learn --librarie clap-guide

Clap Guide

[rust][cli][args]
Rust
Install
cargo add clap --features derive

Clap is the standard Rust library for CLI argument parsing. Derive API generates parser at compile time.

Supports subcommands, flags, positional args, env variable fallback, and shell completion.

The derive macro approach is preferred: annotate a struct and get full parser with --help for free.

Setup

Basic structDefine CLI args.
use clap::Parser;

#[derive(Parser)]
#[command(name = "myapp")]
struct Cli {
    name: String,
    #[arg(short, long)]
    verbose: bool,
}

fn main() {
    let cli = Cli::parse();
    println!("Hello {}", cli.name);
}

Arguments

Optional flagShort and long flags.
#[arg(short, long)]
verbose: bool

#[arg(short = 'o', long = "output")]
output: Option<PathBuf>
Default valuesDefault when not provided.
#[arg(short, long, default_value = "debug")]
log_level: String

#[arg(long, default_value_t = 8080)]
port: u16
Positional argsRequired arguments.
#[derive(Parser)]
struct Cli {
    input_file: PathBuf,
    output_file: Option<PathBuf>,
}

Subcommands

SubcommandsNested commands.
#[derive(Subcommand)]
enum Commands {
    Init { name: String },
    Push { remote: Option<String> },
    Status,
}

#[derive(Parser)]
struct Cli {
    #[command(subcommand)]
    command: Commands,
}

Validation

ValidationValidate argument values.
#[arg(short, long, value_parser = clap::value_parser!(u16).range(1..=65535))]
port: u16

#[arg(long, value_parser = |s: &str| -> Result<String, String> {
    if s.len() < 3 { Err("too short".into()) } else { Ok(s.into()) }
})]
name: String

Output

Help textCustom help.
#[arg(short, long, help = "Set verbosity level")]
verbose: u8

#[command(about = "A fast tool for doing things", long_about = None)]