@@ -145,6 +145,11 @@ pub fn optflag(name: &str) -> Opt {
145
145
return { name: mkname ( name) , hasarg: No , occur: Optional } ;
146
146
}
147
147
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
+
148
153
/// Create an option that is optional and takes an optional argument
149
154
pub fn optflagopt ( name : & str ) -> Opt {
150
155
return { name: mkname ( name) , hasarg: Maybe , occur: Optional } ;
@@ -417,6 +422,11 @@ pub fn opt_present(mm: Matches, nm: &str) -> bool {
417
422
return vec:: len :: < Optval > ( opt_vals ( mm, nm) ) > 0 u;
418
423
}
419
424
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
+
420
430
/// Returns true if any of several options were matched
421
431
pub fn opts_present ( mm : Matches , names : & [ ~str ] ) -> bool {
422
432
for vec:: each( names) |nm| {
@@ -1003,6 +1013,71 @@ mod tests {
1003
1013
}
1004
1014
}
1005
1015
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
+ }
1006
1081
1007
1082
// Tests for optmulti
1008
1083
#[ test]
0 commit comments