pico-args 0.3.1

An ultra simple CLI arguments parser.
Documentation

pico-args

Build Status Crates.io Documentation Rust Stable

An ultra simple CLI arguments parser.

  • Only flags, options and free arguments are supported.
  • Arguments can be separated by a space or =.
  • Non UTF-8 arguments are supported.
  • No help generation.
  • No combined flags (like -vvv, -abc or -j1).
  • Arguments are parsed in a linear order. From first to last.

Example

struct Args {
    help: bool,
    version: bool,
    number: u32,
    opt_number: Option<u32>,
    width: u32,
    free: Vec<String>,
}

fn parse_width(s: &str) -> Result<u32, String> {
    s.parse().map_err(|_| "not a number".to_string())
}

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut args = pico_args::Arguments::from_env();
    // Arguments can be parsed in any order.
    let args = Args {
        // You can use a slice for multiple commands
        help: args.contains(["-h", "--help"]),
        // or just a string for a single one.
        version: args.contains("-V"),
        // Parses an optional value that implements `FromStr`.
        number: args.opt_value_from_str("--number")?.unwrap_or(5),
        // Parses an optional value that implements `FromStr`.
        opt_number: args.opt_value_from_str("--opt-number")?,
        // Parses an optional value using a specified function.
        width: args.opt_value_from_fn("--width", parse_width)?.unwrap_or(10),
        // Will return all free arguments or an error if any flags are left.
        free: args.free()?,
    };

    Ok(())
}

Alternatives

The core idea of pico-args is to provide some "sugar" for arguments parsing without a lot of overhead (binary or compilation time wise). There are no point in comparing parsing features since pico-args supports only the bare minimum. So we will compare only the size overhead and compilation time.

There are a lot of arguments parsing implementations, but we will use only these one:

  • clap - is the most popular and complete one
  • gumdrop - a simple parser that uses procedural macros
  • structopt - a two above combined
pico-args clap gumdrop structopt
Binary overhead 20.0KiB 435.1KiB 23.0KiB 436.8KiB
Build time 1s 15s 31s 27s
Tested version 0.3.0 2.33.0 0.6.0 0.2.18
  • Binary size overhead was measured by subtracting the .text section size of an app with arguments parsing and a hello world app.
  • Build time was measured using hyperfine 'cargo clean; cargo build --release'.
  • Test projects can be found in test-apps/.

License

MIT