From 8c3809afd06d81d99fc0c6b4efbf560732f95f20 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Wed, 1 Jun 2011 18:31:09 -0700 Subject: [PATCH] stdlib: Add some functions to getopts to deal with optional arguments more easily --- src/lib/getopts.rs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/lib/getopts.rs b/src/lib/getopts.rs index abe1a15789d..febccbeb76f 100644 --- a/src/lib/getopts.rs +++ b/src/lib/getopts.rs @@ -15,6 +15,7 @@ export opt; export reqopt; export optopt; export optflag; +export optflagopt; export optmulti; export getopts; @@ -32,6 +33,7 @@ export opt_present; export opt_str; export opt_strs; export opt_maybe_str; +export opt_default; tag name { long(str); short(char); } tag hasarg { yes; no; maybe; } @@ -55,6 +57,9 @@ fn optopt(str name) -> opt { fn optflag(str name) -> opt { ret rec(name=mkname(name), hasarg=no, occur=optional); } +fn optflagopt(str name) -> opt { + ret rec(name=mkname(name), hasarg=maybe, occur=optional); +} fn optmulti(str name) -> opt { ret rec(name=mkname(name), hasarg=yes, occur=multi); } @@ -272,6 +277,18 @@ fn opt_maybe_str(match m, str nm) -> option::t[str] { }; } +/// Returns none if the option was not present, `def` if the option was +/// present but no argument was provided, and the argument if the option was +/// present and an argument was provided. +fn opt_default(match m, str nm, str def) -> option::t[str] { + auto vals = opt_vals(m, nm); + if (vec::len[optval](vals) == 0u) { ret none[str]; } + ret alt (vals.(0)) { + case (val(?s)) { some[str](s) } + case (_) { some[str](def) } + } +} + // Local Variables: // mode: rust; // fill-column: 78;