diff options
Diffstat (limited to 'tools/aapt2/Flags.cpp')
-rw-r--r-- | tools/aapt2/Flags.cpp | 232 |
1 files changed, 122 insertions, 110 deletions
diff --git a/tools/aapt2/Flags.cpp b/tools/aapt2/Flags.cpp index 3731ac74f4ed..cb1619657b4f 100644 --- a/tools/aapt2/Flags.cpp +++ b/tools/aapt2/Flags.cpp @@ -25,155 +25,167 @@ namespace aapt { -Flags& Flags::requiredFlag(const StringPiece& name, const StringPiece& description, - std::string* value) { - auto func = [value](const StringPiece& arg) -> bool { - *value = arg.toString(); - return true; - }; - - mFlags.push_back(Flag{ name.toString(), description.toString(), func, true, 1, false}); - return *this; +Flags& Flags::requiredFlag(const StringPiece& name, + const StringPiece& description, std::string* value) { + auto func = [value](const StringPiece& arg) -> bool { + *value = arg.toString(); + return true; + }; + + mFlags.push_back( + Flag{name.toString(), description.toString(), func, true, 1, false}); + return *this; } -Flags& Flags::requiredFlagList(const StringPiece& name, const StringPiece& description, +Flags& Flags::requiredFlagList(const StringPiece& name, + const StringPiece& description, std::vector<std::string>* value) { - auto func = [value](const StringPiece& arg) -> bool { - value->push_back(arg.toString()); - return true; - }; + auto func = [value](const StringPiece& arg) -> bool { + value->push_back(arg.toString()); + return true; + }; - mFlags.push_back(Flag{ name.toString(), description.toString(), func, true, 1, false }); - return *this; + mFlags.push_back( + Flag{name.toString(), description.toString(), func, true, 1, false}); + return *this; } -Flags& Flags::optionalFlag(const StringPiece& name, const StringPiece& description, +Flags& Flags::optionalFlag(const StringPiece& name, + const StringPiece& description, Maybe<std::string>* value) { - auto func = [value](const StringPiece& arg) -> bool { - *value = arg.toString(); - return true; - }; + auto func = [value](const StringPiece& arg) -> bool { + *value = arg.toString(); + return true; + }; - mFlags.push_back(Flag{ name.toString(), description.toString(), func, false, 1, false }); - return *this; + mFlags.push_back( + Flag{name.toString(), description.toString(), func, false, 1, false}); + return *this; } -Flags& Flags::optionalFlagList(const StringPiece& name, const StringPiece& description, +Flags& Flags::optionalFlagList(const StringPiece& name, + const StringPiece& description, std::vector<std::string>* value) { - auto func = [value](const StringPiece& arg) -> bool { - value->push_back(arg.toString()); - return true; - }; + auto func = [value](const StringPiece& arg) -> bool { + value->push_back(arg.toString()); + return true; + }; - mFlags.push_back(Flag{ name.toString(), description.toString(), func, false, 1, false }); - return *this; + mFlags.push_back( + Flag{name.toString(), description.toString(), func, false, 1, false}); + return *this; } -Flags& Flags::optionalFlagList(const StringPiece& name, const StringPiece& description, +Flags& Flags::optionalFlagList(const StringPiece& name, + const StringPiece& description, std::unordered_set<std::string>* value) { - auto func = [value](const StringPiece& arg) -> bool { - value->insert(arg.toString()); - return true; - }; + auto func = [value](const StringPiece& arg) -> bool { + value->insert(arg.toString()); + return true; + }; - mFlags.push_back(Flag{ name.toString(), description.toString(), func, false, 1, false }); - return *this; + mFlags.push_back( + Flag{name.toString(), description.toString(), func, false, 1, false}); + return *this; } -Flags& Flags::optionalSwitch(const StringPiece& name, const StringPiece& description, - bool* value) { - auto func = [value](const StringPiece& arg) -> bool { - *value = true; - return true; - }; +Flags& Flags::optionalSwitch(const StringPiece& name, + const StringPiece& description, bool* value) { + auto func = [value](const StringPiece& arg) -> bool { + *value = true; + return true; + }; - mFlags.push_back(Flag{ name.toString(), description.toString(), func, false, 0, false }); - return *this; + mFlags.push_back( + Flag{name.toString(), description.toString(), func, false, 0, false}); + return *this; } void Flags::usage(const StringPiece& command, std::ostream* out) { - constexpr size_t kWidth = 50; + constexpr size_t kWidth = 50; - *out << command << " [options]"; - for (const Flag& flag : mFlags) { - if (flag.required) { - *out << " " << flag.name << " arg"; - } + *out << command << " [options]"; + for (const Flag& flag : mFlags) { + if (flag.required) { + *out << " " << flag.name << " arg"; } + } - *out << " files...\n\nOptions:\n"; + *out << " files...\n\nOptions:\n"; - for (const Flag& flag : mFlags) { - std::string argLine = flag.name; - if (flag.numArgs > 0) { - argLine += " arg"; - } + for (const Flag& flag : mFlags) { + std::string argLine = flag.name; + if (flag.numArgs > 0) { + argLine += " arg"; + } - // Split the description by newlines and write out the argument (which is empty after - // the first line) followed by the description line. This will make sure that multiline - // descriptions are still right justified and aligned. - for (StringPiece line : util::tokenize(flag.description, '\n')) { - *out << " " << std::setw(kWidth) << std::left << argLine << line << "\n"; - argLine = " "; - } + // Split the description by newlines and write out the argument (which is + // empty after + // the first line) followed by the description line. This will make sure + // that multiline + // descriptions are still right justified and aligned. + for (StringPiece line : util::tokenize(flag.description, '\n')) { + *out << " " << std::setw(kWidth) << std::left << argLine << line << "\n"; + argLine = " "; } - *out << " " << std::setw(kWidth) << std::left << "-h" << "Displays this help menu\n"; - out->flush(); + } + *out << " " << std::setw(kWidth) << std::left << "-h" + << "Displays this help menu\n"; + out->flush(); } -bool Flags::parse(const StringPiece& command, const std::vector<StringPiece>& args, +bool Flags::parse(const StringPiece& command, + const std::vector<StringPiece>& args, std::ostream* outError) { - for (size_t i = 0; i < args.size(); i++) { - StringPiece arg = args[i]; - if (*(arg.data()) != '-') { - mArgs.push_back(arg.toString()); - continue; - } - - if (arg == "-h" || arg == "--help") { - usage(command, outError); - return false; - } + for (size_t i = 0; i < args.size(); i++) { + StringPiece arg = args[i]; + if (*(arg.data()) != '-') { + mArgs.push_back(arg.toString()); + continue; + } - bool match = false; - for (Flag& flag : mFlags) { - if (arg == flag.name) { - if (flag.numArgs > 0) { - i++; - if (i >= args.size()) { - *outError << flag.name << " missing argument.\n\n"; - usage(command, outError); - return false; - } - flag.action(args[i]); - } else { - flag.action({}); - } - flag.parsed = true; - match = true; - break; - } - } + if (arg == "-h" || arg == "--help") { + usage(command, outError); + return false; + } - if (!match) { - *outError << "unknown option '" << arg << "'.\n\n"; + bool match = false; + for (Flag& flag : mFlags) { + if (arg == flag.name) { + if (flag.numArgs > 0) { + i++; + if (i >= args.size()) { + *outError << flag.name << " missing argument.\n\n"; usage(command, outError); return false; + } + flag.action(args[i]); + } else { + flag.action({}); } + flag.parsed = true; + match = true; + break; + } } - for (const Flag& flag : mFlags) { - if (flag.required && !flag.parsed) { - *outError << "missing required flag " << flag.name << "\n\n"; - usage(command, outError); - return false; - } + if (!match) { + *outError << "unknown option '" << arg << "'.\n\n"; + usage(command, outError); + return false; } - return true; -} + } -const std::vector<std::string>& Flags::getArgs() { - return mArgs; + for (const Flag& flag : mFlags) { + if (flag.required && !flag.parsed) { + *outError << "missing required flag " << flag.name << "\n\n"; + usage(command, outError); + return false; + } + } + return true; } -} // namespace aapt +const std::vector<std::string>& Flags::getArgs() { return mArgs; } + +} // namespace aapt |