[Mono-list] Program Option Parsing Library

Jonathan Pryor jonpryor at vt.edu
Wed Jan 9 14:23:23 EST 2008


I've been doing a lot of work on monodocer, and (for some unknown
reason) decided that the warning about the deprecation of
Mono.GetOptions was annoying so I thought I'd come up with a
replacement.

This replacement is NOT currently intended to be stable, nor to be
bundled with Mono itself for public use.

It is also extremely crack-addled, which is why I'm liking it so much,
and why I thought I'd share it with you.

Crack-addled?  How else would you describe this cunning combination of
collection initializers and lambda delegates?

        bool help = false;
        int verbose = 0;
        string source = null;
        
        var p = new Options () {
                { "h|?|help",  v => help = v != null },
                { "v|verbose", v => { ++verbose; } },
                { "source=",   v => source = v },
        };
        p.Parse (new string[]{"--help", "-v", "-v", "-source=foo"})
                .ToArray ();
        
After p.Parse().ToArray(), help=true, verbose=2, and source="foo".

It is inspired by Perl's Getopt::Long library, except that all option
processing is done via delegates (i.e. Perl `sub's) and not via by-ref
variables (as Perl also supports).

No reflection is used unless you use TypeConverter to implicitly convert
strings to random managed types:

        int n = 0;
        var p = new Options () {
                { "n=", (int v) => n = v }
        };

Options currently supports:

      * Parameters of the form: -flag, --flag, /flag, -flag=value,
        --flag=value, /flag=value, -flag:value,
        --flag:value, /flag:value, -flag value, --flag value, /flag
        value.
      * "boolean" parameters of the form: -flag, --flag, and /flag.
        Boolean parameters can have a `+' or `-' appended to explicitly
        enable or disable the flag (in the same fashion as mcs -debug+).
        For boolean callbacks, the provided value is non-null for
        enabled, and null for disabled.
      * "value" parameters with a required value (append `=' to the
        option name) or an optional value (append `:' to the option
        name). The option value can either be in the current option
        (--opt=value) or in the following parameter (--opt value). The
        actual value is provided as the parameter to the callback
        delegate, unless it's (1) optional and (2) missing, in which
        case null is passed.
      * "bundled" parameters which must start with a single `-' and
        consists of only single characters. In this manner, -abc would
        be a shorthand for -a -b -c.
      * Option processing is disabled when -- is encountered.

Furthermore, it does not treat '-' options differently from '--' or '/'
options, aside from the aforementioned bundling support.

Regardless, at ~270 LOC for the associated classes (not including
comments or tests), I think it's a reasonably concise and useful library
for command-line option processing.

See also: 
    http://www.jprl.com/Blog/archive/development/mono/2008/Jan-07.html

Thoughts?

- Jon

-------------- next part --------------
A non-text attachment was scrubbed...
Name: Options.cs
Type: text/x-csharp
Size: 18529 bytes
Desc: not available
Url : http://lists.ximian.com/pipermail/mono-list/attachments/20080109/ceb781b0/attachment-0001.bin 


More information about the Mono-list mailing list