Skip to content

Commit 8c3809a

Browse files
committed
stdlib: Add some functions to getopts to deal with optional arguments more easily
1 parent 24c9d7e commit 8c3809a

File tree

1 file changed

+17
-0
lines changed

1 file changed

+17
-0
lines changed

src/lib/getopts.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export opt;
1515
export reqopt;
1616
export optopt;
1717
export optflag;
18+
export optflagopt;
1819
export optmulti;
1920

2021
export getopts;
@@ -32,6 +33,7 @@ export opt_present;
3233
export opt_str;
3334
export opt_strs;
3435
export opt_maybe_str;
36+
export opt_default;
3537

3638
tag name { long(str); short(char); }
3739
tag hasarg { yes; no; maybe; }
@@ -55,6 +57,9 @@ fn optopt(str name) -> opt {
5557
fn optflag(str name) -> opt {
5658
ret rec(name=mkname(name), hasarg=no, occur=optional);
5759
}
60+
fn optflagopt(str name) -> opt {
61+
ret rec(name=mkname(name), hasarg=maybe, occur=optional);
62+
}
5863
fn optmulti(str name) -> opt {
5964
ret rec(name=mkname(name), hasarg=yes, occur=multi);
6065
}
@@ -272,6 +277,18 @@ fn opt_maybe_str(match m, str nm) -> option::t[str] {
272277
};
273278
}
274279

280+
/// Returns none if the option was not present, `def` if the option was
281+
/// present but no argument was provided, and the argument if the option was
282+
/// present and an argument was provided.
283+
fn opt_default(match m, str nm, str def) -> option::t[str] {
284+
auto vals = opt_vals(m, nm);
285+
if (vec::len[optval](vals) == 0u) { ret none[str]; }
286+
ret alt (vals.(0)) {
287+
case (val(?s)) { some[str](s) }
288+
case (_) { some[str](def) }
289+
}
290+
}
291+
275292
// Local Variables:
276293
// mode: rust;
277294
// fill-column: 78;

0 commit comments

Comments
 (0)