Convert Figma logo to code with AI

clap-rs logoclap

A full featured, fast Command Line Argument Parser for Rust

14,193
1,037
14,193
323

Top Related Projects

Parse command line arguments by defining a struct.

8,997

Serialization framework for Rust

Quick Overview

Clap (Command Line Argument Parser) is a powerful, flexible, and user-friendly library for parsing command line arguments and subcommands in Rust. It provides a simple and intuitive API for defining complex command-line interfaces while offering extensive customization options and automatic help generation.

Pros

  • Easy to use with a declarative macro-based API and builder pattern
  • Comprehensive feature set, including subcommands, argument validation, and auto-generated help
  • Excellent documentation and examples
  • High performance with minimal allocations

Cons

  • Can be verbose for simple use cases
  • Learning curve for advanced features
  • Compile times can be longer due to heavy use of macros
  • May be overkill for very basic CLI applications

Code Examples

  1. Basic usage with derive macro:
use clap::Parser;

#[derive(Parser, Debug)]
#[command(author, version, about, long_about = None)]
struct Args {
    #[arg(short, long)]
    name: String,
    #[arg(short, long, default_value_t = 1)]
    count: u8,
}

fn main() {
    let args = Args::parse();
    println!("Hello {}!", args.name);
    println!("Count: {}", args.count);
}
  1. Subcommands example:
use clap::{Parser, Subcommand};

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

#[derive(Subcommand)]
enum Commands {
    Add { name: String },
    Commit { message: String },
}

fn main() {
    let cli = Cli::parse();
    match &cli.command {
        Commands::Add { name } => println!("Adding file: {}", name),
        Commands::Commit { message } => println!("Committing with message: {}", message),
    }
}
  1. Builder pattern example:
use clap::{Arg, Command};

fn main() {
    let matches = Command::new("MyApp")
        .version("1.0")
        .author("Author Name")
        .about("Does awesome things")
        .arg(Arg::new("config")
            .short('c')
            .long("config")
            .value_name("FILE")
            .help("Sets a custom config file"))
        .arg(Arg::new("INPUT")
            .help("Sets the input file to use")
            .required(true)
            .index(1))
        .get_matches();

    // Application logic here...
}

Getting Started

To use Clap in your Rust project, add the following to your Cargo.toml:

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

Then, in your Rust file:

use clap::Parser;

#[derive(Parser, Debug)]
#[command(author, version, about, long_about = None)]
struct Args {
    #[arg(short, long)]
    name: String,
}

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

Run your program with cargo run -- --name YourName to see it in action.

Competitor Comparisons

Parse command line arguments by defining a struct.

Pros of structopt

  • Simpler and more intuitive API, leveraging Rust's derive macros
  • Tighter integration with Rust's type system, allowing for automatic type conversion
  • Less boilerplate code required for basic CLI applications

Cons of structopt

  • Less flexible than Clap for complex command-line interfaces
  • Fewer advanced features and customization options
  • Dependent on Clap as an underlying library, potentially limiting direct control

Code Comparison

structopt:

#[derive(StructOpt)]
struct Cli {
    #[structopt(short, long)]
    name: String,
}

Clap:

let matches = App::new("My App")
    .arg(Arg::with_name("name")
        .short("n")
        .long("name")
        .takes_value(true)
        .required(true))
    .get_matches();

structopt provides a more concise and declarative approach to defining CLI arguments, while Clap offers more explicit control over argument configuration. structopt's derive macro simplifies the process, but Clap's builder pattern allows for greater flexibility in complex scenarios.

8,997

Serialization framework for Rust

Pros of serde

  • Broader scope: Handles serialization/deserialization for various formats (JSON, YAML, TOML, etc.)
  • More flexible: Can work with custom data types and complex structures
  • Highly performant: Optimized for speed and efficiency

Cons of serde

  • Steeper learning curve: Requires understanding of derive macros and attributes
  • Not specifically designed for CLI: Requires additional work for command-line argument parsing

Code comparison

serde example:

#[derive(Serialize, Deserialize)]
struct Point {
    x: i32,
    y: i32,
}
let point = Point { x: 1, y: 2 };
let json = serde_json::to_string(&point).unwrap();

clap example:

let matches = App::new("My App")
    .arg(Arg::with_name("config")
        .short("c")
        .long("config")
        .value_name("FILE")
        .help("Sets a custom config file"))
    .get_matches();

While serde focuses on data serialization/deserialization, clap specializes in parsing command-line arguments. serde offers more flexibility for various data formats, while clap provides a more straightforward approach for building CLI applications. The choice between them depends on the specific requirements of your project.

Convert Figma logo designs to code with AI

Visual Copilot

Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.

Try Visual Copilot

README

clap

Command Line Argument Parser for Rust

Crates.io Crates.io License License Build Status Coverage Status Contributors

Dual-licensed under Apache 2.0 or MIT.

About

Create your command-line parser, with all of the bells and whistles, declaratively or procedurally.

For more details, see:

Sponsors

Gold

Silver

Bronze

Backer