cmArgumentParser: Record parsed keywords

This commit is contained in:
Regina Pfeifer 2019-09-20 13:27:02 +02:00
parent 75b2c9717c
commit d5a6a13368
2 changed files with 19 additions and 8 deletions

View File

@ -61,10 +61,14 @@ void Instance::Bind(MultiStringList& val)
void Instance::Consume(cm::string_view arg, void* result,
std::vector<std::string>* unparsedArguments,
std::vector<std::string>* keywordsMissingValue)
std::vector<std::string>* keywordsMissingValue,
std::vector<std::string>* parsedKeywords)
{
auto const it = this->Bindings.Find(arg);
if (it != this->Bindings.end()) {
if (parsedKeywords != nullptr) {
parsedKeywords->emplace_back(arg);
}
it->second(*this, result);
if (this->ExpectValue && keywordsMissingValue != nullptr) {
keywordsMissingValue->emplace_back(arg);

View File

@ -45,7 +45,8 @@ public:
void Consume(cm::string_view arg, void* result,
std::vector<std::string>* unparsedArguments,
std::vector<std::string>* keywordsMissingValue);
std::vector<std::string>* keywordsMissingValue,
std::vector<std::string>* parsedKeywords);
private:
ActionMap const& Bindings;
@ -79,21 +80,25 @@ public:
template <typename Range>
void Parse(Result& result, Range const& args,
std::vector<std::string>* unparsedArguments = nullptr,
std::vector<std::string>* keywordsMissingValue = nullptr) const
std::vector<std::string>* keywordsMissingValue = nullptr,
std::vector<std::string>* parsedKeywords = nullptr) const
{
ArgumentParser::Instance instance(this->Bindings);
for (cm::string_view arg : args) {
instance.Consume(arg, &result, unparsedArguments, keywordsMissingValue);
instance.Consume(arg, &result, unparsedArguments, keywordsMissingValue,
parsedKeywords);
}
}
template <typename Range>
Result Parse(Range const& args,
std::vector<std::string>* unparsedArguments = nullptr,
std::vector<std::string>* keywordsMissingValue = nullptr) const
std::vector<std::string>* keywordsMissingValue = nullptr,
std::vector<std::string>* parsedKeywords = nullptr) const
{
Result result;
this->Parse(result, args, unparsedArguments, keywordsMissingValue);
this->Parse(result, args, unparsedArguments, keywordsMissingValue,
parsedKeywords);
return result;
}
@ -116,11 +121,13 @@ public:
template <typename Range>
void Parse(Range const& args,
std::vector<std::string>* unparsedArguments = nullptr,
std::vector<std::string>* keywordsMissingValue = nullptr) const
std::vector<std::string>* keywordsMissingValue = nullptr,
std::vector<std::string>* parsedKeywords = nullptr) const
{
ArgumentParser::Instance instance(this->Bindings);
for (cm::string_view arg : args) {
instance.Consume(arg, nullptr, unparsedArguments, keywordsMissingValue);
instance.Consume(arg, nullptr, unparsedArguments, keywordsMissingValue,
parsedKeywords);
}
}