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 );