Skip to content

Commit 26ddb4c

Browse files
committed
Include opt_get_default variant.
1 parent 14648ff commit 26ddb4c

File tree

1 file changed

+46
-9
lines changed

1 file changed

+46
-9
lines changed

src/lib.rs

Lines changed: 46 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -842,13 +842,26 @@ impl Matches {
842842
}
843843
}
844844

845-
/// Returns the matching value or `None`.
845+
/// Returns some matching value or `None`.
846846
///
847-
/// Similar to opt_default, except the two differences. Instead of
848-
/// returning None when option was not present, return `def`. Instead of
849-
/// returning &str slice return valued of type T parsed using str::parse().
850-
pub fn opt_get<T>(&self, nm: &str, def: T)
851-
-> result::Result<T, <T as FromStr>::Err> where T: FromStr
847+
/// Similar to opt_str, also converts matching argument using FromStr.
848+
pub fn opt_get<T>(&self, nm: &str) -> result::Result<Option<T>, T::Err>
849+
where T: FromStr
850+
{
851+
match self.opt_val(nm) {
852+
Some(Val(s)) => Ok(Some(s.parse()?)),
853+
Some(Given) => Ok(None),
854+
None => Ok(None),
855+
}
856+
}
857+
858+
/// Returns a matching value or default.
859+
///
860+
/// Similar to opt_default, except the two differences.
861+
/// Instead of returning None when argument was not present, return `def`.
862+
/// Instead of returning &str return type T, parsed using str::parse().
863+
pub fn opt_get_default<T>(&self, nm: &str, def: T)
864+
-> result::Result<T, T::Err> where T: FromStr
852865
{
853866
match self.opt_val(nm) {
854867
Some(Val(s)) => s.parse(),
@@ -2068,11 +2081,35 @@ Options:
20682081
Ok(m) => m,
20692082
Err(e) => panic!("{}", e)
20702083
};
2071-
let h_arg =matches.opt_get("help", 10);
2084+
let h_arg = matches.opt_get::<i32>("help");
2085+
assert_eq!(h_arg, Ok(None));
2086+
let i_arg = matches.opt_get("i");
2087+
assert_eq!(i_arg, Ok(Some(true)));
2088+
let p_arg = matches.opt_get("p");
2089+
assert_eq!(p_arg, Ok(Some(1.1)));
2090+
}
2091+
2092+
#[test]
2093+
fn test_opt_get_default() {
2094+
let mut opts = Options::new();
2095+
opts.optflag("h", "help", "Description");
2096+
opts.optflagopt("i", "ignore", "Description", "true | false");
2097+
opts.optflagopt("r", "run", "Description", "0 .. 10");
2098+
opts.optflagopt("p", "percent", "Description", "0.0 .. 10.0");
2099+
opts.long_only(false);
2100+
2101+
let args: Vec<String> = [
2102+
"-i", "true", "-p", "1.1"
2103+
].iter().map(|x| x.to_string()).collect();
2104+
let matches = &match opts.parse(&args) {
2105+
Ok(m) => m,
2106+
Err(e) => panic!("{}", e)
2107+
};
2108+
let h_arg =matches.opt_get_default("help", 10);
20722109
assert_eq!(h_arg, Ok(10));
2073-
let i_arg = matches.opt_get("i", false);
2110+
let i_arg = matches.opt_get_default("i", false);
20742111
assert_eq!(i_arg, Ok(true));
2075-
let p_arg = matches.opt_get("p", 10.2);
2112+
let p_arg = matches.opt_get_default("p", 10.2);
20762113
assert_eq!(p_arg, Ok(1.1));
20772114
}
20782115
}

0 commit comments

Comments
 (0)