about summary refs log tree commit diff
diff options
context:
space:
mode:
authorTim Chevalier <chevalier@alum.wellesley.edu>2012-11-18 13:56:57 -0800
committerTim Chevalier <chevalier@alum.wellesley.edu>2012-11-18 13:56:57 -0800
commit5e4ed709cba6bf0d6df3b50b86c12cd59cf4f842 (patch)
tree83163cfae68aa2087429b0f4754745e89a6fd657
parente2f4f06625ea4d4a98e7bc7c032380a1cba91d18 (diff)
parent340955b3a55c0707e72d64b2ce4cdcf21529fafb (diff)
downloadrust-5e4ed709cba6bf0d6df3b50b86c12cd59cf4f842.tar.gz
rust-5e4ed709cba6bf0d6df3b50b86c12cd59cf4f842.zip
Merge pull request #3998 from jesse99/feature/getopts
Added support for options that take no arguments and may be repeated.
-rw-r--r--src/libstd/getopts.rs75
1 files changed, 75 insertions, 0 deletions
diff --git a/src/libstd/getopts.rs b/src/libstd/getopts.rs
index 8d77b88aba2..b7d6dc69776 100644
--- a/src/libstd/getopts.rs
+++ b/src/libstd/getopts.rs
@@ -145,6 +145,11 @@ pub fn optflag(name: &str) -> Opt {
     return {name: mkname(name), hasarg: No, occur: Optional};
 }
 
+/// Create an option that is optional and does not take an argument
+pub fn optflagmulti(name: &str) -> Opt {
+    return {name: mkname(name), hasarg: No, occur: Multi};
+}
+
 /// Create an option that is optional and takes an optional argument
 pub fn optflagopt(name: &str) -> Opt {
     return {name: mkname(name), hasarg: Maybe, occur: Optional};
@@ -417,6 +422,11 @@ pub fn opt_present(mm: Matches, nm: &str) -> bool {
     return vec::len::<Optval>(opt_vals(mm, nm)) > 0u;
 }
 
+/// Returns the number of times an option was matched
+pub fn opt_count(mm: Matches, nm: &str) -> uint {
+    return vec::len::<Optval>(opt_vals(mm, nm));
+}
+
 /// Returns true if any of several options were matched
 pub fn opts_present(mm: Matches, names: &[~str]) -> bool {
     for vec::each(names) |nm| {
@@ -1003,6 +1013,71 @@ mod tests {
         }
     }
 
+    // Tests for optflagmulti
+    #[test]
+    fn test_optflagmulti_short1() {
+        let args = ~[~"-v"];
+        let opts = ~[optflagmulti(~"v")];
+        let rs = getopts(args, opts);
+        match rs {
+          Ok(copy m) => {
+            assert (opt_count(m, ~"v") == 1);
+          }
+          _ => fail
+        }
+    }
+
+    #[test]
+    fn test_optflagmulti_short2a() { 
+        let args = ~[~"-v", ~"-v"];
+        let opts = ~[optflagmulti(~"v")];
+        let rs = getopts(args, opts);
+        match rs {
+          Ok(copy m) => {
+            assert (opt_count(m, ~"v") == 2);
+          }
+          _ => fail
+        }
+    }
+
+    #[test]
+    fn test_optflagmulti_short2b() {
+        let args = ~[~"-vv"];
+        let opts = ~[optflagmulti(~"v")];
+        let rs = getopts(args, opts);
+        match rs {
+          Ok(copy m) => {
+            assert (opt_count(m, ~"v") == 2);
+          }
+          _ => fail
+        }
+    }
+
+    #[test]
+    fn test_optflagmulti_long1() {
+        let args = ~[~"--verbose"];
+        let opts = ~[optflagmulti(~"verbose")];
+        let rs = getopts(args, opts);
+        match rs {
+          Ok(copy m) => {
+            assert (opt_count(m, ~"verbose") == 1);
+          }
+          _ => fail
+        }
+    }
+
+    #[test]
+    fn test_optflagmulti_long2() {
+        let args = ~[~"--verbose", ~"--verbose"];
+        let opts = ~[optflagmulti(~"verbose")];
+        let rs = getopts(args, opts);
+        match rs {
+          Ok(copy m) => {
+            assert (opt_count(m, ~"verbose") == 2);
+          }
+          _ => fail
+        }
+    }
 
     // Tests for optmulti
     #[test]