@@ -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