AAPT2: Debug: Dump only targetted style

Change-Id: Id7c5a4b5d0880520e1fea05e5a31d398946c5f05
diff --git a/tools/aapt2/Flag.cpp b/tools/aapt2/Flag.cpp
index 0f63c2c..76985da 100644
--- a/tools/aapt2/Flag.cpp
+++ b/tools/aapt2/Flag.cpp
@@ -13,7 +13,7 @@
 struct Flag {
     std::string name;
     std::string description;
-    std::function<void(const StringPiece&)> action;
+    std::function<bool(const StringPiece&, std::string*)> action;
     bool required;
     bool* flagResult;
     bool flagValueWhenSet;
@@ -23,22 +23,38 @@
 static std::vector<Flag> sFlags;
 static std::vector<std::string> sArgs;
 
+static std::function<bool(const StringPiece&, std::string*)> wrap(
+        const std::function<void(const StringPiece&)>& action) {
+    return [action](const StringPiece& arg, std::string*) -> bool {
+        action(arg);
+        return true;
+    };
+}
+
 void optionalFlag(const StringPiece& name, const StringPiece& description,
                   std::function<void(const StringPiece&)> action) {
-    sFlags.push_back(
-            Flag{ name.toString(), description.toString(), action, false, nullptr, false, false });
+    sFlags.push_back(Flag{
+            name.toString(), description.toString(), wrap(action),
+            false, nullptr, false, false });
 }
 
 void requiredFlag(const StringPiece& name, const StringPiece& description,
                   std::function<void(const StringPiece&)> action) {
-    sFlags.push_back(
-            Flag{ name.toString(), description.toString(), action, true, nullptr, false, false });
+    sFlags.push_back(Flag{ name.toString(), description.toString(), wrap(action),
+            true, nullptr, false, false });
+}
+
+void requiredFlag(const StringPiece& name, const StringPiece& description,
+                  std::function<bool(const StringPiece&, std::string*)> action) {
+    sFlags.push_back(Flag{ name.toString(), description.toString(), action,
+            true, nullptr, false, false });
 }
 
 void optionalSwitch(const StringPiece& name, const StringPiece& description, bool resultWhenSet,
                     bool* result) {
     sFlags.push_back(Flag{
-            name.toString(), description.toString(), {}, false, result, resultWhenSet, false });
+            name.toString(), description.toString(), {},
+            false, result, resultWhenSet, false });
 }
 
 void usageAndDie(const StringPiece& command) {
@@ -62,6 +78,7 @@
 }
 
 void parse(int argc, char** argv, const StringPiece& command) {
+    std::string errorStr;
     for (int i = 0; i < argc; i++) {
         const StringPiece arg(argv[i]);
         if (*arg.data() != '-') {
@@ -83,7 +100,11 @@
                                   << std::endl;
                         usageAndDie(command);
                     }
-                    flag.action(argv[i]);
+
+                    if (!flag.action(argv[i], &errorStr)) {
+                        std::cerr << errorStr << "." << std::endl << std::endl;
+                        usageAndDie(command);
+                    }
                 }
                 break;
             }