1 #ifndef APPLICATION_UTILITIES_ARGUMENTPARSER_H 2 #define APPLICATION_UTILITIES_ARGUMENTPARSER_H 7 #include <initializer_list> 30 #ifndef APP_STATICALLY_LINKED 31 #define SET_DEPENDENCY_INFO ::ApplicationUtilities::dependencyVersions = DEPENCENCY_VERSIONS 33 #define SET_DEPENDENCY_INFO ::ApplicationUtilities::dependencyVersions = STATIC_DEPENCENCY_VERSIONS 41 #define SET_APPLICATION_INFO \ 42 ::ApplicationUtilities::applicationName = APP_NAME; \ 43 ::ApplicationUtilities::applicationAuthor = APP_AUTHOR; \ 44 ::ApplicationUtilities::applicationVersion = APP_VERSION; \ 45 ::ApplicationUtilities::applicationUrl = APP_URL; \ 95 return static_cast<bool>(
static_cast<unsigned char>(lhs) & static_cast<unsigned char>(rhs));
106 ArgumentOccurrence(std::size_t index,
const std::vector<Argument *> parentPath,
Argument *parent);
146 path.push_back(parent);
158 Argument(
const char *name,
char abbreviation =
'\0',
const char *description =
nullptr,
const char *example =
nullptr);
161 const char *name()
const;
162 void setName(
const char *name);
163 char abbreviation()
const;
164 void setAbbreviation(
char abbreviation);
165 const char *environmentVariable()
const;
166 void setEnvironmentVariable(
const char *environmentVariable);
167 const char *description()
const;
168 void setDescription(
const char *description);
169 const char *example()
const;
170 void setExample(
const char *example);
171 const std::vector<const char *> &
values(std::size_t occurrence = 0)
const;
172 const char *firstValue()
const;
173 std::size_t requiredValueCount()
const;
174 void setRequiredValueCount(std::size_t requiredValueCount);
175 const std::vector<const char *> &valueNames()
const;
176 void setValueNames(std::initializer_list<const char *> valueNames);
177 void appendValueName(
const char *valueName);
178 bool allRequiredValuesPresent(std::size_t occurrence = 0)
const;
179 bool isPresent()
const;
180 std::size_t occurrences()
const;
181 std::size_t
index(std::size_t occurrence)
const;
182 std::size_t minOccurrences()
const;
183 std::size_t maxOccurrences()
const;
184 void setConstraints(std::size_t minOccurrences, std::size_t maxOccurrences);
185 const std::vector<Argument *> &
path(std::size_t occurrence = 0)
const;
186 bool isRequired()
const;
187 void setRequired(
bool required);
188 bool isCombinable()
const;
189 void setCombinable(
bool value);
190 bool isImplicit()
const;
191 void setImplicit(
bool value);
192 bool denotesOperation()
const;
193 void setDenotesOperation(
bool denotesOperation);
194 const CallbackFunction &callback()
const;
195 void setCallback(CallbackFunction callback);
196 void printInfo(std::ostream &os,
unsigned char indentation = 0)
const;
197 const ArgumentVector &subArguments()
const;
198 void setSubArguments(
const ArgumentInitializerList &subArguments);
200 bool hasSubArguments()
const;
201 const ArgumentVector parents()
const;
202 bool isMainArgument()
const;
203 bool isParentPresent()
const;
206 const char *preDefinedCompletionValues()
const;
207 void setPreDefinedCompletionValues(
const char *preDefinedCompletionValues);
208 Argument *conflictsWithArgument()
const;
209 Argument *wouldConflictWithArgument()
const;
210 Argument *specifiedOperation()
const;
212 void resetRecursively();
218 static constexpr std::size_t varValueCount = std::numeric_limits<std::size_t>::max();
223 const char *m_environmentVar;
224 const char *m_description;
225 const char *m_example;
226 std::size_t m_minOccurrences;
227 std::size_t m_maxOccurrences;
229 bool m_denotesOperation;
230 std::size_t m_requiredValueCount;
231 std::vector<const char *> m_valueNames;
233 std::vector<ArgumentOccurrence> m_occurrences;
234 ArgumentVector m_subArgs;
235 CallbackFunction m_callbackFunction;
236 ArgumentVector m_parents;
239 const char *m_preDefinedCompletionValues;
249 const ArgumentVector &mainArguments()
const;
250 void setMainArguments(
const ArgumentInitializerList &mainArguments);
251 void addMainArgument(
Argument *argument);
252 void printHelp(std::ostream &os)
const;
253 void parseArgs(
int argc,
const char *
const *argv);
254 void parseArgsOrExit(
int argc,
const char *
const *argv);
255 void readArgs(
int argc,
const char *
const *argv);
257 unsigned int actualArgumentCount()
const;
258 const char *executable()
const;
262 void setDefaultArgument(
Argument *argument);
263 Argument *specifiedOperation()
const;
264 void checkConstraints();
265 void invokeCallbacks();
266 bool isUncombinableMainArgPresent()
const;
269 IF_DEBUG_BUILD(
void verifyArgs(
const ArgumentVector &args, std::vector<char> abbreviations, std::vector<const char *> names);)
270 void printBashCompletion(
int argc,
const char *
const *argv,
unsigned int cursorPos,
const ArgumentReader &reader);
271 void checkConstraints(
const ArgumentVector &args);
272 static void invokeCallbacks(
const ArgumentVector &args);
274 ArgumentVector m_mainArgs;
275 unsigned int m_actualArgc;
276 const char *m_executable;
302 assert(*name !=
'-');
303 for (
const char *c = name; *c; ++c) {
304 assert(*c !=
' ' && *c !=
'=' && *c !=
'\'' && *c !=
'\"' && *c !=
'\n' && *c !=
'\r');
318 return m_abbreviation;
330 IF_DEBUG_BUILD(assert(abbreviation !=
' ' && abbreviation !=
'=' && abbreviation !=
'-' && abbreviation !=
'\'' && abbreviation !=
'"' 331 && abbreviation !=
'\n' && abbreviation !=
'\r'));
332 m_abbreviation = abbreviation;
341 return m_environmentVar;
350 m_environmentVar = environmentVariable;
360 return m_description;
370 m_description = description;
401 return m_occurrences[occurrence].values;
419 return m_requiredValueCount;
436 m_requiredValueCount = requiredValueCount;
467 m_valueNames.assign(valueNames);
478 m_valueNames.emplace_back(valueName);
486 return m_requiredValueCount ==
static_cast<std::size_t
>(-1)
487 || (m_occurrences[occurrence].
values.size() >=
static_cast<std::size_t
>(m_requiredValueCount));
505 m_implicit = implicit;
513 return !m_occurrences.empty();
521 return m_occurrences.size();
529 return m_occurrences[occurrence].index;
539 return m_minOccurrences;
549 return m_maxOccurrences;
559 m_minOccurrences = minOccurrences;
560 m_maxOccurrences = maxOccurrences;
566 inline const std::vector<Argument *> &
Argument::path(std::size_t occurrence)
const 568 return m_occurrences[occurrence].path;
582 return m_minOccurrences;
595 if (!m_minOccurrences) {
596 m_minOccurrences = 1;
599 m_minOccurrences = 0;
626 m_combinable = value;
641 return m_denotesOperation;
650 m_denotesOperation = denotesOperation;
659 return m_callbackFunction;
670 m_callbackFunction = callback;
692 return !m_subArgs.empty();
726 return m_valueCompletionBehavior;
734 m_valueCompletionBehavior = completionValues;
742 return m_preDefinedCompletionValues;
750 m_preDefinedCompletionValues = preDefinedCompletionValues;
758 m_occurrences.clear();
793 return m_unknownArgBehavior;
803 m_unknownArgBehavior = behavior;
821 m_defaultArg = argument;
831 checkConstraints(m_mainArgs);
840 invokeCallbacks(m_mainArgs);
850 OperationArgument(
const char *name,
char abbreviation =
'\0',
const char *description =
nullptr,
const char *example =
nullptr);
854 :
Argument(name, abbreviation, description, example)
862 std::initializer_list<const char *>
valueNames = std::initializer_list<const char *>());
870 :
Argument(name, abbreviation, description)
889 #endif // APPLICATION_UTILITIES_ARGUMENTPARSER_H bool isMainArgument() const
Returns an indication whether the argument is used as main argument.
std::function< bool(Argument *)> ArgumentPredicate
CPP_UTILITIES_EXPORT const char * applicationUrl
Specifies the URL to the application website (used by ArgumentParser::printHelp()).
ValueCompletionBehavior
The ValueCompletionBehavior enum specifies the items to be considered when generating completion for ...
const char * preDefinedCompletionValues() const
Returns the assigned values used when generating completion for the values.
bool denotesOperation() const
Returns whether the argument denotes the operation.
UnknownArgumentBehavior unknownArgumentBehavior() const
Returns how unknown arguments are treated.
The ConfigValueArgument class is an Argument where setCombinable() is true by default.
std::initializer_list< Argument * > ArgumentInitializerList
#define IF_DEBUG_BUILD(x)
Wraps debug-only lines conveniently.
Argument * defaultArgument() const
Returns the default argument.
std::size_t requiredValueCount() const
Returns the number of values which are required to be given for this argument.
void setImplicit(bool value)
Sets whether the argument is an implicit argument.
const char * description() const
Returns the description of the argument.
std::size_t index
The index of the occurrence.
void setCombinable(bool value)
Sets whether this argument can be combined.
ValueCompletionBehavior valueCompletionBehaviour() const
Returns the items to be considered when generating completion for the values.
void setUnknownArgumentBehavior(UnknownArgumentBehavior behavior)
Sets how unknown arguments are treated.
const ArgumentVector parents() const
Returns the parents of this argument.
Contains currently only ArgumentParser and related classes.
std::size_t maxOccurrences() const
Returns the maximum number of occurrences.
constexpr DirectoryEntryType operator|(DirectoryEntryType lhs, DirectoryEntryType rhs)
bool isRequired() const
Returns an indication whether the argument is mandatory.
Argument CPP_UTILITIES_EXPORT * firstPresentUncombinableArg(const ArgumentVector &args, const Argument *except)
This function return the first present and uncombinable argument of the given list of arguments...
void setRequired(bool required)
Sets whether this argument is mandatory or not.
std::size_t index(std::size_t occurrence) const
Returns the indices of the argument's occurences which could be detected when parsing.
std::function< void(const ArgumentOccurrence &)> CallbackFunction
void setDefaultArgument(Argument *argument)
Sets the default argument.
CPP_UTILITIES_EXPORT const char * applicationVersion
Specifies the version of the application (used by ArgumentParser::printHelp()).
ConfigValueArgument(const char *name, char abbreviation='\0', const char *description=nullptr, std::initializer_list< const char *> valueNames=std::initializer_list< const char *>())
Constructs a new ConfigValueArgument with the specified parameter.
void invokeCallbacks()
Invokes all assigned callbacks.
The NoColorArgument class allows to specify whether use of escape codes or similar technique to provi...
The ArgumentParserTests class tests the ArgumentParser and Argument classes.
void checkConstraints()
Checks whether contraints are violated.
const char * name() const
Returns the name of the argument.
const std::vector< const char * > & valueNames() const
Returns the names of the requried values.
The OperationArgument class is an Argument where denotesOperation() is true by default.
void setConstraints(std::size_t minOccurrences, std::size_t maxOccurrences)
Sets the allowed number of occurrences.
const ArgumentVector & subArguments() const
Returns the secondary arguments for this argument.
std::size_t minOccurrences() const
Returns the minimum number of occurrences.
void setAbbreviation(char abbreviation)
Sets the abbreviation of the argument.
void setDescription(const char *description)
Sets the description of the argument.
void setValueCompletionBehavior(ValueCompletionBehavior valueCompletionBehaviour)
Sets the items to be considered when generating completion for the values.
void appendValueName(const char *valueName)
Appends a value name.
CPP_UTILITIES_EXPORT std::initializer_list< const char * > dependencyVersions
Specifies the dependency versions the application was linked against (used by ArgumentParser::printHe...
const std::vector< const char * > & values(std::size_t occurrence=0) const
Returns the parameter values for the specified occurrence of argument.
CPP_UTILITIES_EXPORT void(* exitFunction)(int)
Specifies a function quit the application.
const char * executable() const
Returns the name of the current executable.
std::size_t occurrences() const
Returns how often the argument could be detected when parsing.
The Argument class is a wrapper for command line argument information.
void setCallback(CallbackFunction callback)
Sets a callback function which will be called by the parser if the argument could be found and no par...
void setExample(const char *example)
Sets the a usage example for the argument.
const std::vector< Argument * > & path(std::size_t occurrence=0) const
Returns the path of the specified occurrence.
bool isCombinable() const
Returns an indication whether the argument is combinable.
void setPreDefinedCompletionValues(const char *preDefinedCompletionValues)
Assignes the values to be used when generating completion for the values.
std::vector< Argument * > path
The "path" of the occurrence (the parent elements which have been specified before).
UnknownArgumentBehavior
The UnknownArgumentBehavior enum specifies the behavior of the argument parser when an unknown argume...
OperationArgument(const char *name, char abbreviation='\0', const char *description=nullptr, const char *example=nullptr)
void setEnvironmentVariable(const char *environmentVariable)
Sets the environment variable queried when firstValue() is called.
The ArgumentOccurrence struct holds argument values for an occurrence of an argument.
CPP_UTILITIES_EXPORT const char * applicationName
Specifies the name of the application (used by ArgumentParser::printHelp()).
bool isPresent() const
Returns an indication whether the argument could be detected when parsing.
bool hasSubArguments() const
Returns an indication whether the argument has secondary arguments.
const CallbackFunction & callback() const
Returns the assigned callback function.
The HelpArgument class prints help information for an argument parser when present (–help...
bool allRequiredValuesPresent(std::size_t occurrence=0) const
Returns an indication whether all required values are present.
const ArgumentVector & mainArguments() const
Returns the main arguments.
void setDenotesOperation(bool denotesOperation)
Sets whether the argument denotes the operation.
char abbreviation() const
Returns the abbreviation of the argument.
const char * example() const
Returns the usage example of the argument.
void reset()
Resets occurrences (indices, values and paths).
ArgumentOccurrence(std::size_t index)
Constructs an argument occurrence for the specified index.
void setRequiredValueCount(std::size_t requiredValueCount)
Sets the number of values which are required to be given for this argument.
CPP_UTILITIES_EXPORT const char * applicationAuthor
Specifies the author of the application (used by ArgumentParser::printHelp()).
The ArgumentReader class internally encapsulates the process of reading command line arguments...
#define CPP_UTILITIES_EXPORT
Marks the symbol to be exported by the c++utilities library.
const char * environmentVariable() const
Returns the environment variable queried when firstValue() is called.
unsigned int actualArgumentCount() const
Returns the actual number of arguments that could be found when parsing.
void setName(const char *name)
Sets the name of the argument.
bool isImplicit() const
Returns an indication whether the argument is an implicit argument.
The ArgumentParser class provides a means for handling command line arguments.
void setValueNames(std::initializer_list< const char *> valueNames)
Sets the names of the requried values.
std::vector< Argument * > ArgumentVector
constexpr DirectoryEntryType operator &(DirectoryEntryType lhs, DirectoryEntryType rhs)
std::vector< const char * > values
The parameter values which have been specified after the occurrence of the argument.