Crates.io | foropts |
lib.rs | foropts |
version | 0.3.6 |
source | src |
created_at | 2018-04-30 16:20:31.357651 |
updated_at | 2018-05-30 23:20:12.659061 |
description | An argument-parsing iterator |
homepage | |
repository | https://github.com/tov/foropts-rs |
max_upload_size | |
id | 63176 |
size | 40,757 |
Most argument parsing libraries, such as
clap
, treat the arguments as a
multimap; foropts
treats the arguments as a sequence. This usually
isn’t what you want, but occasionally it is.
It's on crates.io, so you can add
[dependencies]
foropts = "0.3.6"
to your Cargo.toml
and
extern crate foropts;
to your crate root.
This crate supports Rust version 1.22 and later.
In this example, we accept one boolean flag, -v
(or --verbose
), and two
string options, -b
(or --before
) and -a
(or --after
). The string options
build a string, where the relative order of the appearances of -a
and -b
matters.
This is hard to do when your arguments are treated as a multimap, but easy when
you can iterate over them sequentially.
use foropts;
enum Opt {
Before(String),
After(String),
Verbose,
}
let config =
foropts::Config::new("build_string_example")
.arg(foropts::Arg::parsed_param("BEFORE", Opt::Before)
.short('b').long("before"))
.arg(foropts::Arg::parsed_param("AFTER", Opt::After)
.short('a').long("after"))
.arg(foropts::Arg::flag(|| Opt::Verbose)
.short('v').long("verbose"));
let mut verbose = false;
let mut accumulator = String::new();
let opts = ["-b1", "-va", "2", "--after=3", "--before", "4"]
.iter().map(ToString::to_string);
for opt in config.iter(opts) {
match opt.unwrap_or_else(|e| config.exit_error(&e)) {
Opt::Before(s) => accumulator = s + &accumulator,
Opt::After(s) => accumulator = accumulator + &s,
Opt::Verbose => verbose = true,
}
}
assert_eq!( "4123", accumulator );
assert!( verbose );