diff --git a/src/argparse.hpp b/src/argparse.hpp index adfbb4d..ced832d 100644 --- a/src/argparse.hpp +++ b/src/argparse.hpp @@ -31,14 +31,16 @@ struct Argument { std::function mAction; std::any mValue; std::string mRawValue; + size_t mNumArgs; Argument() : mNames({}), mHelp(""), mDefaultValue(nullptr), - mAction(nullptr), + mAction([](const std::string& aValue) { return aValue; }), mValue(nullptr), - mRawValue("") {} + mRawValue(""), + mNumArgs(1) {} Argument& help(const std::string& aHelp) { mHelp = aHelp; @@ -55,6 +57,11 @@ struct Argument { return *this; } + Argument& nargs(size_t aNumArgs) { + mNumArgs = aNumArgs; + return *this; + } + template T get() { if (!mValue.has_value()) { @@ -117,6 +124,32 @@ class ArgumentParser { } } + void parse_args_2(int argc, char * argv[]) { + for (int i = 1; i < argc; i++) { + auto tCurrentArgument = argv[i]; + std::map>::iterator tIterator = mArgumentMap.find(argv[i]); + if (tIterator != mArgumentMap.end()) { + auto tArgument = tIterator->second; + auto tCount = tArgument->mNumArgs; + while (tCount > 0) { + i = i + 1; + if (i < argc) { + tArgument->mRawValue = argv[i]; + if (tArgument->mAction != nullptr) + tArgument->mValue = tArgument->mAction(argv[i]); + else { + if (tArgument->mDefaultValue != nullptr) + tArgument->mValue = tArgument->mDefaultValue(); + else + tArgument->mValue = std::string(argv[i]); + } + } + tCount -= 1; + } + } + } + } + Argument& operator[](const char * key) { for (auto& tArgument : mArguments) { auto tIndex = std::find(tArgument->mNames.begin(), tArgument->mNames.end(), key); diff --git a/tests/main.cpp b/tests/main.cpp index 72f90a4..a5b3ba3 100644 --- a/tests/main.cpp +++ b/tests/main.cpp @@ -11,12 +11,13 @@ int main(int argc, char * argv[]) { program.add_argument("-n", "--num_iterations") .help("Number of iterations") + .nargs(2) .action([](const std::string& value) { return std::stoi(value); }); program.add_argument("-v", "--verbose", "VERBOSE") .default_value([]() { return true; }); - program.parse_args(argc, argv); + program.parse_args_2(argc, argv); auto config_file = program.get("--config"); auto num_iters = program.get("-n");