getopt2 - strict command line argument parser for Rust
Version 0.1.0 MIT Licensed
Features
- Simple argument parsing rules: 1.1. No option grouping. 1.1. No argument grouping. 1.1. Unrecognised options are parsed as arguments.
- GNU argument parsing rules by default. Options can be anywhere in command line before --
- POSIX parsing rules activated by "+" extension. First non option stops option parsing. "+a:"
- double dash -- support. Anything after -- is not treated as options.
- Optional arguments support extension "a::".
- No op compatibility with ":" extension - allow to use "?" as option character.
Code quality
- MSRV 1.56, accessible from entire Rust 2021 Edition.
- Rust port of well tested Scala getopt code.
- Small code size. Less than 200 LOC.
- Zero dependencies.
- No
unsafeRust. - Runs on stable 2021 Edition Rust.
- 68 unit tests, 7 integration tests, and 6 doc tests.
Usage
1. Create getopt instance
let g = getopt2::new(arguments, optstring)
getopt2::new constructor arguments:
- arguments command line arguments. Can be anything what can be converted to
Iterator over String. You can use
std::env::args()but you need to skip first argument because its executable name. It can be done manually or by callinghideBinutility function which strips its first argument. - optstring is a anything providing
AsRef <str>. optstring is containing the legitimate option characters. Valid option characters are alphanumeric plus '?'. If such a character is followed by a colon, the option requires an argument.
Returned value:
- Function returns
Result <getopt>. Resultwraps parsing errors and getopt structure.- Parsing can fail only if optstring is invalid.
- If required argument is missing function new() won't fail. Call validate() on parsed result for optional argument checking.
2. Check parsed options
getopt structure returned by constructor has following public members:
- arguments :
Vec <String>command line arguments with options removed - options_map :
HashMap <char, bool>map of recognized options. option -> have_argument - options :
HashMap <char, String>options parsed. If option do not have argument, it is mapped to ""String, otherwise it is mapped to its argument asString.
Structure getopt supports IntoIterator and can transform itself into Iterator
over supplied command line arguments.
It supports consuming itself or use self immutable reference for enumerating arguments.
getopt.iter() returns Iterator over pub field arguments without consuming itself.
getopt.len() returns number of command line arguments. It's convience shortcut for getopt.arguments.len().
getopt.get() returns value of command line option. It's convience shortcut for getopt.options.get().
getopt.has() returns if option got supplied on command line. It's convience shortcut for getopt.options.contains_key().
3. Optional - Check if correct options were provided
You can run strict parse checks by calling validate(getopt) function.
This function returns back Result with supplied getopt instance on success or
error as String. It can detect if unknown options were encountered or
required arguments are missing.
Example
use args;
use hideBin;
let rc = new;
if let Ok = rc ;
Reference
- POSIX getopt function.
- GNU libc getopt function.
- OpenBSD getopt
- FreeBSD getopt
Known getopt extensions
Fully implemented
- GNU getopt parsing rules.
- Options can be anywhere in command line before --
- double dash -- support. Anything after -- is not treated as options.
- POSIX extension in the getopt function where the argument string
specification can start with a colon (:). When the option string begins with
a colon, it modifies the behavior of getopt to handle error cases differently.
Specifically, it suppresses the default error messages that getopt prints
when it encounters an unrecognized option or a missing argument,
and it returns : instead of ? for these error cases. This allows using ? as
option because its possible to spot difference unknown option and -? option.
- Extension is implemented in way that '?' as option is always supported. ':' at start of option string is fully optional and have no effect on activating this extension.
Not implemented
- Two colons in optstring indicates that the argument is optional. This is an extension not covered by POSIX. This will change only validate function because we do not report errors in getopt2::new if required argument is missing.
- In GNU getopt, if the option string (optstring) begins with a + character, it triggers POSIX-compatible parsing. This means that the first non-option argument will stop option parsing, similar to how setting the POSIXLY_CORRECT environment variable behaves.
Possible future developments
Some code for these features exists, but development is paused. Partially implemented code is not compiled during normal build and can't be enabled in stock crate using features.
posixstrict mode. First non option stops option parsing. This is needed for parsing nested command lines.