Add method for parsing args with customizable behavior

This commit is contained in:
Martchus 2017-11-27 10:23:38 +01:00
parent 9744efda70
commit 424a0bfb6f
2 changed files with 72 additions and 9 deletions

View File

@ -721,11 +721,7 @@ void ArgumentParser::printHelp(ostream &os) const
*/
void ArgumentParser::parseArgs(int argc, const char *const *argv)
{
readArgs(argc, argv);
if (argc) {
checkConstraints(m_mainArgs);
invokeCallbacks(m_mainArgs);
}
parseArgsExt(argc, argv, ParseArgumentBehavior::CheckConstraints | ParseArgumentBehavior::InvokeCallbacks);
}
/*!
@ -734,16 +730,52 @@ void ArgumentParser::parseArgs(int argc, const char *const *argv)
* case. Instead, it will print an error message and terminate the application with exit
* code 1.
* \sa parseArgs(), readArgs()
* \deprecated In next major release, this method will be removed. parseArgs() can serve the same
* purpose then.
*/
void ArgumentParser::parseArgsOrExit(int argc, const char *const *argv)
{
parseArgsExt(argc, argv);
}
/*!
* \brief Parses the specified command line arguments.
*
* The behavior is configurable by specifying the \a behavior argument. See ParseArgumentBehavior for
* the options. By default, all options are present.
*
* \remarks
* - The results are stored in the Argument instances assigned as main arguments and sub arguments.
* - This method will not return in the error case if the ParseArgumentBehavior::ExitOnFailure is present
* (default).
* - This method will not return in case shell completion is requested. This behavior can be altered
* by overriding ApplicationUtilities::exitFunction which defaults to &std::exit.
* \throws Throws Failure if the specified arguments are invalid and the ParseArgumentBehavior::ExitOnFailure
* flag is not present.
* \sa parseArgs(), readArgs(), parseArgsOrExit()
* \deprecated In next major release, this method will be available as parseArgs().
*/
void ArgumentParser::parseArgsExt(int argc, const char *const *argv, ParseArgumentBehavior behavior)
{
try {
parseArgs(argc, argv);
readArgs(argc, argv);
if (!argc) {
return;
}
if (behavior & ParseArgumentBehavior::CheckConstraints) {
checkConstraints(m_mainArgs);
}
if (behavior & ParseArgumentBehavior::InvokeCallbacks) {
invokeCallbacks(m_mainArgs);
}
} catch (const Failure &failure) {
if (behavior & ParseArgumentBehavior::ExitOnFailure) {
CMD_UTILS_START_CONSOLE;
cerr << failure;
exit(1);
}
throw;
}
}
/*!
@ -756,6 +788,8 @@ void ArgumentParser::parseArgsOrExit(int argc, const char *const *argv)
* by overriding ApplicationUtilities::exitFunction which defaults to &std::exit.
* \throws Throws Failure if the specified arguments are invalid.
* \sa parseArgs(), parseArgsOrExit()
* \deprecated In next major release, this method will be private. parseArgs() can serve the same
* purpose then.
*/
void ArgumentParser::readArgs(int argc, const char *const *argv)
{

View File

@ -65,6 +65,32 @@ enum class UnknownArgumentBehavior {
Fail /**< Further parsing is aborted and an ApplicationUtilities::Failure instance with an error message is thrown. */
};
/*!
* \brief The ParseArgumentBehavior enum specifies the behavior when parsing arguments.
*
* This concerns checking constraints, invoking callbacks and handling failures. The values are supposed to be combined
* using the |-operator. Note that ParseArgumentBehavior::ReadArguments is always implied.
*/
enum class ParseArgumentBehavior {
ReadArguments = 0x0, /**< reads the specified CLI arguments, equivalent to simply calling readArgs() */
CheckConstraints = 0x1, /**< whether the constraints should be checked after reading the arguments */
InvokeCallbacks = 0x2, /**< whether the callbacks should be invoked after reading the arguments and (maybe) checking the constraints */
ExitOnFailure
= 0x4, /**< whether the parser should print an error message and terminate the application on failure (rather than throwing an exception) */
};
/// \cond
constexpr ParseArgumentBehavior operator|(ParseArgumentBehavior lhs, ParseArgumentBehavior rhs)
{
return static_cast<ParseArgumentBehavior>(static_cast<unsigned char>(lhs) | static_cast<unsigned char>(rhs));
}
constexpr bool operator&(ParseArgumentBehavior lhs, ParseArgumentBehavior rhs)
{
return static_cast<bool>(static_cast<unsigned char>(lhs) & static_cast<unsigned char>(rhs));
}
/// \endcond
/*!
* \brief The ValueCompletionBehavior enum specifies the items to be considered when generating completion for an argument value.
* \remarks
@ -254,6 +280,9 @@ public:
void printHelp(std::ostream &os) const;
void parseArgs(int argc, const char *const *argv);
void parseArgsOrExit(int argc, const char *const *argv);
void parseArgsExt(int argc, const char *const *argv,
ParseArgumentBehavior behavior
= ParseArgumentBehavior::CheckConstraints | ParseArgumentBehavior::InvokeCallbacks | ParseArgumentBehavior::ExitOnFailure);
void readArgs(int argc, const char *const *argv);
void resetArgs();
unsigned int actualArgumentCount() const;