Implement parse_args_internal for positional parameters

This commit is contained in:
Stephan van Veen 2019-05-15 22:18:23 +02:00
parent 3c9a74049f
commit 44bef34e79

View File

@ -113,19 +113,21 @@ public:
} }
template <typename Iterator> template <typename Iterator>
Iterator consume(Iterator start, Iterator end) { Iterator consume(Iterator start, Iterator end, std::string usedName = {}) {
if (mIsUsed) { if (mIsUsed) {
throw std::runtime_error("Duplicate argument"); throw std::runtime_error("Duplicate argument");
} }
mIsUsed = true; mIsUsed = true;
mUsedName = *start; mUsedName = std::move(usedName);
start = std::next(start);
if (mNumArgs == 0) { if (mNumArgs == 0) {
mValues.emplace_back(mImplicitValue); mValues.emplace_back(mImplicitValue);
return start; return start;
} }
else if (mNumArgs <= std::distance(start, end)) { else if (mNumArgs <= std::distance(start, end)) {
end = std::next(start, mNumArgs); end = std::next(start, mNumArgs);
if (std::any_of(start, end, Argument::is_optional)) {
throw std::runtime_error("optional argument in parameter sequence");
}
std::transform(start, end, std::back_inserter(mValues), mAction); std::transform(start, end, std::back_inserter(mValues), mAction);
return end; return end;
} }
@ -436,12 +438,17 @@ class ArgumentParser {
} }
auto tIterator = mArgumentMap.find(tCurrentArgument); auto tIterator = mArgumentMap.find(tCurrentArgument);
if (tIterator != mArgumentMap.end()) { if (tIterator != mArgumentMap.end()) {
// Start parsing optional argument
auto tArgument = tIterator->second; auto tArgument = tIterator->second;
it = tArgument->consume(std::next(it), end, tCurrentArgument);
}
else if (!Argument::is_optional(tCurrentArgument)) {
if (mNextPositionalArgument >= mPositionalArguments.size()) {
throw std::runtime_error("Maximum number of positional arguments exceeded");
}
auto tArgument = mPositionalArguments[mNextPositionalArgument++];
it = tArgument->consume(it, end); it = tArgument->consume(it, end);
} }
else { else { // TODO: compound optional arguments
// TODO: compound optional arguments
++it; ++it;
} }
} }