@@ -145,6 +145,11 @@ pub fn optflag(name: &str) -> Opt {
145145 return { name: mkname ( name) , hasarg: No , occur: Optional } ;
146146}
147147
148+ /// Create an option that is optional and does not take an argument
149+ pub fn optflagmulti ( name : & str ) -> Opt {
150+ return { name: mkname ( name) , hasarg: No , occur: Multi } ;
151+ }
152+
148153/// Create an option that is optional and takes an optional argument
149154pub fn optflagopt ( name : & str ) -> Opt {
150155 return { name: mkname ( name) , hasarg: Maybe , occur: Optional } ;
@@ -417,6 +422,11 @@ pub fn opt_present(mm: Matches, nm: &str) -> bool {
417422 return vec:: len :: < Optval > ( opt_vals ( mm, nm) ) > 0 u;
418423}
419424
425+ /// Returns the number of times an option was matched
426+ pub fn opt_count ( mm : Matches , nm : & str ) -> uint {
427+ return vec:: len :: < Optval > ( opt_vals ( mm, nm) ) ;
428+ }
429+
420430/// Returns true if any of several options were matched
421431pub fn opts_present ( mm : Matches , names : & [ ~str ] ) -> bool {
422432 for vec:: each( names) |nm| {
@@ -1003,6 +1013,71 @@ mod tests {
10031013 }
10041014 }
10051015
1016+ // Tests for optflagmulti
1017+ #[ test]
1018+ fn test_optflagmulti_short1 ( ) {
1019+ let args = ~[ ~"-v"] ;
1020+ let opts = ~[ optflagmulti ( ~"v") ] ;
1021+ let rs = getopts ( args, opts) ;
1022+ match rs {
1023+ Ok ( copy m) => {
1024+ assert ( opt_count ( m, ~"v") == 1 ) ;
1025+ }
1026+ _ => fail
1027+ }
1028+ }
1029+
1030+ #[ test]
1031+ fn test_optflagmulti_short2a ( ) {
1032+ let args = ~[ ~"-v", ~"-v"] ;
1033+ let opts = ~[ optflagmulti ( ~"v") ] ;
1034+ let rs = getopts ( args, opts) ;
1035+ match rs {
1036+ Ok ( copy m) => {
1037+ assert ( opt_count ( m, ~"v") == 2 ) ;
1038+ }
1039+ _ => fail
1040+ }
1041+ }
1042+
1043+ #[ test]
1044+ fn test_optflagmulti_short2b ( ) {
1045+ let args = ~[ ~"-vv"] ;
1046+ let opts = ~[ optflagmulti ( ~"v") ] ;
1047+ let rs = getopts ( args, opts) ;
1048+ match rs {
1049+ Ok ( copy m) => {
1050+ assert ( opt_count ( m, ~"v") == 2 ) ;
1051+ }
1052+ _ => fail
1053+ }
1054+ }
1055+
1056+ #[ test]
1057+ fn test_optflagmulti_long1 ( ) {
1058+ let args = ~[ ~"--verbose"] ;
1059+ let opts = ~[ optflagmulti ( ~"verbose") ] ;
1060+ let rs = getopts ( args, opts) ;
1061+ match rs {
1062+ Ok ( copy m) => {
1063+ assert ( opt_count ( m, ~"verbose") == 1 ) ;
1064+ }
1065+ _ => fail
1066+ }
1067+ }
1068+
1069+ #[ test]
1070+ fn test_optflagmulti_long2 ( ) {
1071+ let args = ~[ ~"--verbose", ~"--verbose"] ;
1072+ let opts = ~[ optflagmulti ( ~"verbose") ] ;
1073+ let rs = getopts ( args, opts) ;
1074+ match rs {
1075+ Ok ( copy m) => {
1076+ assert ( opt_count ( m, ~"verbose") == 2 ) ;
1077+ }
1078+ _ => fail
1079+ }
1080+ }
10061081
10071082 // Tests for optmulti
10081083 #[ test]
0 commit comments