Explorar el Código

Add support for abbreviated arguments with repeating, e.g. -vk for verbose dry run.

Sam Jaffe hace 4 años
padre
commit
1986a4ec67
Se han modificado 1 ficheros con 23 adiciones y 18 borrados
  1. 23 18
      include/program_args/arguments_impl.hpp

+ 23 - 18
include/program_args/arguments_impl.hpp

@@ -98,8 +98,6 @@ template <typename Impl> bool Arguments<Impl>::Option::primed() const {
 
 }
 
-#define arg_equals(str) !strncmp(argv[i], str, sizeof(str))
-#define arg_starts_with(str) !strncmp(argv[i], str, strlen(str))
 namespace program {
 
 template <typename Impl>
@@ -114,25 +112,34 @@ Arguments<Impl>::Arguments(int argc, char const * const * const argv) {
   primed_ = true;
   program = argv[0];
   for (size_t i = 1; i < argc; ++i) {
-    if (arg_equals("--help")) {
+    std::string arg = argv[i];
+    char abbrev = arg[1];
+    if (arg == "--help") {
       usage();
-      std::exit(0); // TODO: ???
-    } else if (arg_equals("--")) {
-      // TODO: Special arguments store for passthroughs
+      std::exit(0);
+    } else if (arg == "--") {
       arguments.insert(arguments.end(), &argv[i + 1], &argv[argc]);
       break;
-    } else if (argv[i][0] != '-') {
-      arguments.emplace_back(argv[i]);
-    } else if (!is_flag(argv[i])) {
-      options[id(argv[i])].emplace_back(argv[i]);
-      ++i;
-    } else {
-      // TODO: Flag handling for e.g. -v2 -vv
-      if (arg_starts_with("--no-")) {
-        flags[id(argv[i])] = 0;
+    } else if (arg[0] != '-') {
+      arguments.emplace_back(arg);
+    } else if (is_flag(arg)) {
+      if (arg.substr(0, 4) == "--no-") {
+        flags[id(arg)] = 0;
       } else {
-        ++flags[id(argv[i])];
+        ++flags[id(arg)];
       }
+    } else if (is_option(arg)) {
+      options[id(arg)].emplace_back(arg);
+      ++i;
+    } else if (is_flag(abbrev)) {
+      for (auto c : arg.substr(1)) {
+        if (!is_flag(c)) { throw NotAnArgumentError({'-', c}); }
+        ++flags[id(c)];
+      }
+    } else if (is_option(abbrev)) {
+      options[id(abbrev)].emplace_back(arg.substr(2));
+    } else {
+      throw NotAnArgumentError(arg);
     }
   }
 }
@@ -217,5 +224,3 @@ auto Arguments<Impl>::option(std::string const & name, char abbrev,
 }
 
 }
-#undef arg_equals
-#undef arg_starts_with