phosphor-gpio-monitor: Replace Argument class with CLI11

Signed-off-by: George Liu <liuxiwei@inspur.com>
Change-Id: Id750beb9f8b8f8ec0c611c58b9a0ef86d92750f4
diff --git a/mainapp.cpp b/mainapp.cpp
index 7a3300f..2496a89 100644
--- a/mainapp.cpp
+++ b/mainapp.cpp
@@ -14,59 +14,51 @@
  * limitations under the License.
  */
 
-#include "argument.hpp"
 #include "monitor.hpp"
 
 #include <systemd/sd-event.h>
 
+#include <CLI/CLI.hpp>
 #include <phosphor-logging/lg2.hpp>
 
 #include <iostream>
 #include <string>
 
-static void exitWithError(const char* err, char** argv)
-{
-    phosphor::gpio::ArgumentParser::usage(argv);
-    std::cerr << "ERROR: " << err << "\n";
-    exit(EXIT_FAILURE);
-}
-
 int main(int argc, char** argv)
 {
+    CLI::App app{"Monitor GPIO line for requested state change"};
+
     // Read arguments.
-    auto options = phosphor::gpio::ArgumentParser(argc, argv);
+    std::string path{};
+    std::string key{};
+    std::string polarity{};
+    std::string target{};
+    bool continueRun = false;
 
-    // Parse out path argument.
-    auto path = (options)["path"];
-    if (path == phosphor::gpio::ArgumentParser::emptyString)
+    /* Add an input option */
+    app.add_option("-p,--path", path,
+                   "Path of input device. Ex: /dev/input/event2")
+        ->required();
+    app.add_option("-k,--key", key, "Input GPIO key number")->required();
+    app.add_option("-r,--polarity", polarity,
+                   "Asertion polarity to look for. This is 0 / 1")
+        ->required();
+    app.add_option("-t,--target", target,
+                   "Systemd unit to be called on GPIO state change")
+        ->required();
+    app.add_option("-c,--continue", continueRun,
+                   "PWhether or not to continue after key pressed");
+
+    /* Parse input parameter */
+    try
     {
-        exitWithError("path not specified.", argv);
+        app.parse(argc, argv);
     }
-
-    // Parse out key number that we are interested in
-    // Its integer mapping to the GPIO key configured by the kernel
-    auto key = (options)["key"];
-    if (key == phosphor::gpio::ArgumentParser::emptyString)
+    catch (const CLI::Error& e)
     {
-        exitWithError("Key not specified.", argv);
+        return app.exit(e);
     }
 
-    // Parse out assertion polarity interested in
-    // Its either 1 or 0 for press / release
-    auto polarity = (options)["polarity"];
-    if (polarity == phosphor::gpio::ArgumentParser::emptyString)
-    {
-        exitWithError("Polarity not specified.", argv);
-    }
-
-    // Parse out target argument. It is fine if the caller does not
-    // pass this if they are not interested in calling into any target
-    // on meeting a condition.
-    auto target = (options)["target"];
-
-    bool continueRun =
-        (options["continue"] == phosphor::gpio::ArgumentParser::trueString);
-
     sd_event* event = nullptr;
     auto r = sd_event_default(&event);
     if (r < 0)
@@ -90,7 +82,7 @@
         if (r < 0)
         {
             lg2::error("Failure in processing request: {RC}", "RC", r);
-            break;
+            return r;
         }
     }