Top Related Projects
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
- 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);
}
- 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),
}
}
- 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
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.
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.
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 designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
StructOpt
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
- Apache License, Version 2.0 (LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or https://opensource.org/licenses/MIT)
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.
Top Related Projects
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot