Cogs and Levers A blog full of technical stuff

clap

Parsing CLI arguments manually works — until it doesn’t.

Flags multiply. Validation logic grows. Help output becomes inconsistent.

clap solves this. It gives you structured, validated CLI parsing with automatic help text and error handling.

What Problem Does clap Solve?

  • Argument parsing
  • Validation
  • Help generation
  • Subcommands

Without writing a mini parser.

Minimal Example

Cargo.toml

[dependencies]
clap = { version = "4", features = ["derive"] }

main.rs

use clap::Parser;

#[derive(Parser, Debug)]
#[command(name = "demo")]
struct Args {
    #[arg(short, long)]
    port: u16,

    #[arg(long, default_value = "localhost")]
    host: String,
}

fn main() {
    let args = Args::parse();
    println!("{args:?}");
}

Run:

cargo run -- --port 8080

Clap:

  • Parses
  • Validates
  • Prints help automatically

What’s Actually Happening?

The derive macro generates a parser from your struct definition.

Your struct becomes:

  • CLI schema
  • Validation contract
  • Documentation source

It centralizes everything.

Where It Fits

Use clap when:

  • Building CLI tools
  • Writing dev utilities
  • Creating internal tooling

It scales from simple flags to complex subcommand trees.

Trade-offs

Pros

  • Excellent help output
  • Strong validation
  • Derive ergonomics

Cons

  • Large dependency
  • Derive macros can hide complexity

Should You Use It?

If you’re writing a CLI tool:

Yes.

Manual parsing is rarely worth it anymore.