Convert Figma logo to code with AI

TeXitoi logostructopt

Parse command line arguments by defining a struct.

2,704
149
2,704
8

Top Related Projects

14,193

A full featured, fast Command Line Argument Parser for Rust

1,626

Rust derive-based argument parsing optimized for code size

8,997

Serialization framework for Rust

Quick Overview

structopt is a Rust library that simplifies command-line argument parsing by using Rust's struct attributes. It allows developers to define their CLI interface using a struct, making it easier to create complex command-line applications with minimal boilerplate code.

Pros

  • Easy to use and intuitive syntax
  • Automatic generation of help messages and error handling
  • Supports subcommands and nested structures
  • Integrates well with Rust's type system and borrowing rules

Cons

  • Limited flexibility compared to more low-level argument parsing libraries
  • May have a steeper learning curve for developers unfamiliar with Rust's attribute system
  • Documentation could be more comprehensive for advanced use cases
  • Potential compile-time overhead for large CLI applications

Code Examples

  1. Basic usage:
use structopt::StructOpt;

#[derive(StructOpt)]
struct Cli {
    #[structopt(short, long)]
    name: String,
    #[structopt(short, long, default_value = "1")]
    count: u32,
}

fn main() {
    let args = Cli::from_args();
    println!("Hello {}!", args.name);
    println!("Count: {}", args.count);
}
  1. Subcommands:
use structopt::StructOpt;

#[derive(StructOpt)]
enum Cli {
    Add { name: String },
    Remove { name: String },
}

fn main() {
    match Cli::from_args() {
        Cli::Add { name } => println!("Adding {}", name),
        Cli::Remove { name } => println!("Removing {}", name),
    }
}
  1. Custom parsing:
use structopt::StructOpt;
use std::path::PathBuf;

#[derive(StructOpt)]
struct Cli {
    #[structopt(parse(from_os_str))]
    input: PathBuf,
    #[structopt(short, long, parse(from_occurrences))]
    verbose: u8,
}

fn main() {
    let args = Cli::from_args();
    println!("Input file: {:?}", args.input);
    println!("Verbosity: {}", args.verbose);
}

Getting Started

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

[dependencies]
structopt = "0.3"

Then, in your Rust file:

use structopt::StructOpt;

#[derive(StructOpt)]
struct Cli {
    // Define your CLI structure here
}

fn main() {
    let args = Cli::from_args();
    // Use parsed arguments
}

Run your program with cargo run -- [arguments] to see it in action.

Competitor Comparisons

14,193

A full featured, fast Command Line Argument Parser for Rust

Pros of clap

  • More flexible and customizable, offering fine-grained control over argument parsing
  • Extensive documentation and a larger community, providing better support and resources
  • Supports multiple parsing styles (e.g., builder pattern, YAML configuration)

Cons of clap

  • More verbose syntax, requiring more code to set up command-line arguments
  • Steeper learning curve due to its extensive feature set and API

Code Comparison

structopt:

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

clap:

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

structopt provides a more concise and declarative approach using derive macros, while clap offers a more explicit and customizable builder pattern. structopt is built on top of clap, offering a simpler API for common use cases at the cost of some flexibility. clap is better suited for complex command-line interfaces with advanced features, while structopt excels in quickly creating straightforward CLIs with less boilerplate code.

1,626

Rust derive-based argument parsing optimized for code size

Pros of argh

  • Simpler syntax and less boilerplate code
  • Supports positional arguments more intuitively
  • Easier to use for small to medium-sized projects

Cons of argh

  • Less feature-rich compared to structopt
  • Limited support for complex command-line interfaces
  • Fewer options for customizing help messages

Code Comparison

structopt:

#[derive(StructOpt)]
struct Cli {
    #[structopt(short, long)]
    name: String,
    #[structopt(short, long, default_value = "0")]
    count: u32,
}

argh:

#[derive(FromArgs)]
struct Cli {
    #[argh(option, short = 'n')]
    name: String,
    #[argh(option, short = 'c', default = "0")]
    count: u32,
}

Both libraries aim to simplify command-line argument parsing in Rust, but they differ in their approach and feature set. structopt offers more advanced features and customization options, making it suitable for complex CLI applications. On the other hand, argh provides a simpler and more straightforward syntax, which can be beneficial for smaller projects or developers who prefer a more minimalistic approach.

The code comparison demonstrates the syntax differences between the two libraries. structopt uses the StructOpt derive macro and offers more verbose attribute options, while argh uses the FromArgs derive macro with a more concise syntax for defining command-line arguments.

8,997

Serialization framework for Rust

Pros of serde

  • Broader scope: Supports serialization and deserialization for many formats (JSON, YAML, TOML, etc.)
  • More mature and widely adopted in the Rust ecosystem
  • Extensive documentation and examples available

Cons of serde

  • Steeper learning curve due to its more complex nature
  • May be overkill for simple command-line argument parsing tasks
  • Requires more boilerplate code for basic use cases

Code Comparison

structopt example:

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

serde example:

#[derive(Serialize, Deserialize)]
struct Config {
    name: String,
}

Summary

structopt is specifically designed for parsing command-line arguments, making it simpler and more straightforward for that particular use case. It provides a more intuitive API for defining CLI options and arguments.

serde, on the other hand, is a general-purpose serialization/deserialization library that can be used for various data formats. While it can be used for parsing command-line arguments (with additional libraries), its primary strength lies in its versatility and wide-ranging support for different data formats.

Choose structopt for focused CLI argument parsing, and serde for broader serialization/deserialization needs or when working with multiple data formats in 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

StructOpt

Build status unsafe forbidden

Parse command line arguments by defining a struct. It combines clap with custom derive.

Maintenance

As clap v3 is now out, and the structopt features are integrated into (almost as-is), structopt is now in maintenance mode: no new feature will be added.

Bugs will be fixed, and documentation improvements will be accepted.

See the structopt -> clap migration guide

Documentation

Find it on Docs.rs. You can also check the examples and the changelog.

Example

Add structopt to your dependencies of your Cargo.toml:

[dependencies]
structopt = "0.3"

And then, in your rust file:

use std::path::PathBuf;
use structopt::StructOpt;

/// A basic example
#[derive(StructOpt, Debug)]
#[structopt(name = "basic")]
struct Opt {
    // A flag, true if used in the command line. Note doc comment will
    // be used for the help message of the flag. The name of the
    // argument will be, by default, based on the name of the field.
    /// Activate debug mode
    #[structopt(short, long)]
    debug: bool,

    // The number of occurrences of the `v/verbose` flag
    /// Verbose mode (-v, -vv, -vvv, etc.)
    #[structopt(short, long, parse(from_occurrences))]
    verbose: u8,

    /// Set speed
    #[structopt(short, long, default_value = "42")]
    speed: f64,

    /// Output file
    #[structopt(short, long, parse(from_os_str))]
    output: PathBuf,

    // the long option will be translated by default to kebab case,
    // i.e. `--nb-cars`.
    /// Number of cars
    #[structopt(short = "c", long)]
    nb_cars: Option<i32>,

    /// admin_level to consider
    #[structopt(short, long)]
    level: Vec<String>,

    /// Files to process
    #[structopt(name = "FILE", parse(from_os_str))]
    files: Vec<PathBuf>,
}

fn main() {
    let opt = Opt::from_args();
    println!("{:#?}", opt);
}

Using this example:

$ ./basic
error: The following required arguments were not provided:
    --output <output>

USAGE:
    basic --output <output> --speed <speed>

For more information try --help
$ ./basic --help
basic 0.3.0
Guillaume Pinot <texitoi@texitoi.eu>, others
A basic example

USAGE:
    basic [FLAGS] [OPTIONS] --output <output> [--] [file]...

FLAGS:
    -d, --debug      Activate debug mode
    -h, --help       Prints help information
    -V, --version    Prints version information
    -v, --verbose    Verbose mode (-v, -vv, -vvv, etc.)

OPTIONS:
    -l, --level <level>...     admin_level to consider
    -c, --nb-cars <nb-cars>    Number of cars
    -o, --output <output>      Output file
    -s, --speed <speed>        Set speed [default: 42]

ARGS:
    <file>...    Files to process
$ ./basic -o foo.txt
Opt {
    debug: false,
    verbose: 0,
    speed: 42.0,
    output: "foo.txt",
    nb_cars: None,
    level: [],
    files: [],
}
$ ./basic -o foo.txt -dvvvs 1337 -l alice -l bob --nb-cars 4 bar.txt baz.txt
Opt {
    debug: true,
    verbose: 3,
    speed: 1337.0,
    output: "foo.txt",
    nb_cars: Some(
        4,
    ),
    level: [
        "alice",
        "bob",
    ],
    files: [
        "bar.txt",
        "baz.txt",
    ],
}

StructOpt rustc version policy

  • Minimum rustc version modification must be specified in the changelog and in the travis configuration.
  • Contributors can increment minimum rustc version without any justification if the new version is required by the latest version of one of StructOpt's dependencies (cargo update will not fail on StructOpt).
  • Contributors can increment minimum rustc version if the library user experience is improved.

License

Licensed under either of

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.