Skip to content

Commit 4fbd37d

Browse files
committed
auto merge of #8135 : dim-an/rust/master, r=pcwalton
Fix std::getopt::opts_str Closes #6492 (std::getopt::opts_str fails for arguments other than the first one).
2 parents 38d62fe + ef7e945 commit 4fbd37d

File tree

1 file changed

+47
-18
lines changed

1 file changed

+47
-18
lines changed

src/libextra/getopts.rs

+47-18
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,9 @@ pub fn optflag(name: &str) -> Opt {
140140
return Opt {name: mkname(name), hasarg: No, occur: Optional};
141141
}
142142

143-
/// Create an option that is optional and does not take an argument
143+
/** Create an option that is optional, does not take an argument,
144+
* and may occur multiple times.
145+
*/
144146
pub fn optflagmulti(name: &str) -> Opt {
145147
return Opt {name: mkname(name), hasarg: No, occur: Multi};
146148
}
@@ -369,7 +371,14 @@ fn opt_vals(mm: &Matches, nm: &str) -> ~[Optval] {
369371
};
370372
}
371373

372-
fn opt_val(mm: &Matches, nm: &str) -> Optval { opt_vals(mm, nm)[0].clone() }
374+
fn opt_val(mm: &Matches, nm: &str) -> Option<Optval> {
375+
let vals = opt_vals(mm, nm);
376+
if (vals.is_empty()) {
377+
None
378+
} else {
379+
Some(opt_vals(mm, nm)[0].clone())
380+
}
381+
}
373382

374383
/// Returns true if an option was matched
375384
pub fn opt_present(mm: &Matches, nm: &str) -> bool {
@@ -400,7 +409,10 @@ pub fn opts_present(mm: &Matches, names: &[~str]) -> bool {
400409
* argument
401410
*/
402411
pub fn opt_str(mm: &Matches, nm: &str) -> ~str {
403-
return match opt_val(mm, nm) { Val(s) => s, _ => fail!() };
412+
return match opt_val(mm, nm) {
413+
Some(Val(s)) => s,
414+
_ => fail!()
415+
};
404416
}
405417

406418
/**
@@ -412,7 +424,7 @@ pub fn opt_str(mm: &Matches, nm: &str) -> ~str {
412424
pub fn opts_str(mm: &Matches, names: &[~str]) -> ~str {
413425
for names.iter().advance |nm| {
414426
match opt_val(mm, *nm) {
415-
Val(ref s) => return (*s).clone(),
427+
Some(Val(ref s)) => return (*s).clone(),
416428
_ => ()
417429
}
418430
}
@@ -1318,24 +1330,41 @@ mod tests {
13181330
13191331
#[test]
13201332
fn test_multi() {
1321-
let args = ~[~"-e", ~"foo", ~"--encrypt", ~"foo"];
13221333
let opts = ~[optopt("e"), optopt("encrypt"), optopt("f")];
1323-
let matches = &match getopts(args, opts) {
1334+
1335+
let args_single = ~[~"-e", ~"foo"];
1336+
let matches_single = &match getopts(args_single, opts) {
1337+
result::Ok(m) => m,
1338+
result::Err(_) => fail!()
1339+
};
1340+
assert!(opts_present(matches_single, [~"e"]));
1341+
assert!(opts_present(matches_single, [~"encrypt", ~"e"]));
1342+
assert!(opts_present(matches_single, [~"e", ~"encrypt"]));
1343+
assert!(!opts_present(matches_single, [~"encrypt"]));
1344+
assert!(!opts_present(matches_single, [~"thing"]));
1345+
assert!(!opts_present(matches_single, []));
1346+
1347+
assert_eq!(opts_str(matches_single, [~"e"]), ~"foo");
1348+
assert_eq!(opts_str(matches_single, [~"e", ~"encrypt"]), ~"foo");
1349+
assert_eq!(opts_str(matches_single, [~"encrypt", ~"e"]), ~"foo");
1350+
1351+
let args_both = ~[~"-e", ~"foo", ~"--encrypt", ~"foo"];
1352+
let matches_both = &match getopts(args_both, opts) {
13241353
result::Ok(m) => m,
13251354
result::Err(_) => fail!()
13261355
};
1327-
assert!(opts_present(matches, [~"e"]));
1328-
assert!(opts_present(matches, [~"encrypt"]));
1329-
assert!(opts_present(matches, [~"encrypt", ~"e"]));
1330-
assert!(opts_present(matches, [~"e", ~"encrypt"]));
1331-
assert!(!opts_present(matches, [~"f"]));
1332-
assert!(!opts_present(matches, [~"thing"]));
1333-
assert!(!opts_present(matches, []));
1334-
1335-
assert_eq!(opts_str(matches, [~"e"]), ~"foo");
1336-
assert_eq!(opts_str(matches, [~"encrypt"]), ~"foo");
1337-
assert_eq!(opts_str(matches, [~"e", ~"encrypt"]), ~"foo");
1338-
assert_eq!(opts_str(matches, [~"encrypt", ~"e"]), ~"foo");
1356+
assert!(opts_present(matches_both, [~"e"]));
1357+
assert!(opts_present(matches_both, [~"encrypt"]));
1358+
assert!(opts_present(matches_both, [~"encrypt", ~"e"]));
1359+
assert!(opts_present(matches_both, [~"e", ~"encrypt"]));
1360+
assert!(!opts_present(matches_both, [~"f"]));
1361+
assert!(!opts_present(matches_both, [~"thing"]));
1362+
assert!(!opts_present(matches_both, []));
1363+
1364+
assert_eq!(opts_str(matches_both, [~"e"]), ~"foo");
1365+
assert_eq!(opts_str(matches_both, [~"encrypt"]), ~"foo");
1366+
assert_eq!(opts_str(matches_both, [~"e", ~"encrypt"]), ~"foo");
1367+
assert_eq!(opts_str(matches_both, [~"encrypt", ~"e"]), ~"foo");
13391368
}
13401369
13411370
#[test]

0 commit comments

Comments
 (0)