1 #ifndef APPLICATION_UTILITIES_ARGUMENTPARSER_H 2 #define APPLICATION_UTILITIES_ARGUMENTPARSER_H 7 #include <initializer_list> 27 #define SET_APPLICATION_INFO \ 28 ::ApplicationUtilities::applicationName = APP_NAME; \ 29 ::ApplicationUtilities::applicationAuthor = APP_AUTHOR; \ 30 ::ApplicationUtilities::applicationVersion = APP_VERSION; \ 31 ::ApplicationUtilities::applicationUrl = APP_URL 75 return static_cast<bool>(
static_cast<unsigned char>(lhs) & static_cast<unsigned char>(rhs));
87 ArgumentOccurrence(std::size_t index,
const std::vector<Argument *> parentPath,
Argument *parent);
126 path.push_back(parent);
138 Argument(
const char *name,
char abbreviation =
'\0',
const char *description =
nullptr,
const char *example =
nullptr);
141 const char *name()
const;
142 void setName(
const char *name);
143 char abbreviation()
const;
144 void setAbbreviation(
char abbreviation);
145 const char *environmentVariable()
const;
146 void setEnvironmentVariable(
const char *environmentVariable);
147 const char *description()
const;
148 void setDescription(
const char *description);
149 const char *example()
const;
150 void setExample(
const char *example);
151 const std::vector<const char *> &
values(std::size_t occurrence = 0)
const;
152 const char *firstValue()
const;
153 std::size_t requiredValueCount()
const;
154 void setRequiredValueCount(std::size_t requiredValueCount);
155 const std::vector<const char *> &valueNames()
const;
156 void setValueNames(std::initializer_list<const char *> valueNames);
157 void appendValueName(
const char *valueName);
158 bool allRequiredValuesPresent(std::size_t occurrence = 0)
const;
159 bool isPresent()
const;
160 std::size_t occurrences()
const;
161 std::size_t
index(std::size_t occurrence)
const;
162 std::size_t minOccurrences()
const;
163 std::size_t maxOccurrences()
const;
164 void setConstraints(std::size_t minOccurrences, std::size_t maxOccurrences);
165 const std::vector<Argument *> &
path(std::size_t occurrence = 0)
const;
166 bool isRequired()
const;
167 void setRequired(
bool required);
168 bool isCombinable()
const;
169 void setCombinable(
bool value);
170 bool isImplicit()
const;
171 void setImplicit(
bool value);
172 bool denotesOperation()
const;
173 void setDenotesOperation(
bool denotesOperation);
174 void setCallback(CallbackFunction callback);
175 void printInfo(std::ostream &os,
unsigned char indentation = 0)
const;
176 const ArgumentVector &subArguments()
const;
177 void setSubArguments(
const ArgumentInitializerList &subArguments);
179 bool hasSubArguments()
const;
180 const ArgumentVector parents()
const;
181 bool isMainArgument()
const;
182 bool isParentPresent()
const;
185 const char *preDefinedCompletionValues()
const;
186 void setPreDefinedCompletionValues(
const char *preDefinedCompletionValues);
187 Argument *conflictsWithArgument()
const;
188 Argument *wouldConflictWithArgument()
const;
190 void resetRecursively();
195 const char *m_environmentVar;
196 const char *m_description;
197 const char *m_example;
198 std::size_t m_minOccurrences;
199 std::size_t m_maxOccurrences;
201 bool m_denotesOperation;
202 std::size_t m_requiredValueCount;
203 std::vector<const char *> m_valueNames;
205 std::vector<ArgumentOccurrence> m_occurrences;
206 ArgumentVector m_subArgs;
207 CallbackFunction m_callbackFunction;
208 ArgumentVector m_parents;
211 const char *m_preDefinedCompletionValues;
222 const ArgumentVector &mainArguments()
const;
223 void setMainArguments(
const ArgumentInitializerList &mainArguments);
224 void addMainArgument(
Argument *argument);
225 void printHelp(std::ostream &os)
const;
226 void parseArgs(
int argc,
const char *
const *argv);
227 void readArgs(
int argc,
const char *
const *argv);
229 unsigned int actualArgumentCount()
const;
230 const char *executable()
const;
234 void setDefaultArgument(
Argument *argument);
235 void checkConstraints();
236 void invokeCallbacks();
237 bool isUncombinableMainArgPresent()
const;
240 IF_DEBUG_BUILD(
void verifyArgs(
const ArgumentVector &args, std::vector<char> abbreviations, std::vector<const char *> names);)
241 void printBashCompletion(
int argc,
const char *
const *argv,
unsigned int cursorPos,
const ArgumentReader &reader);
242 void checkConstraints(
const ArgumentVector &args);
243 void invokeCallbacks(
const ArgumentVector &args);
245 ArgumentVector m_mainArgs;
246 unsigned int m_actualArgc;
247 const char *m_executable;
273 assert(*name !=
'-');
274 for(
const char *c = name; *c; ++c) {
275 assert(*c !=
' ' && *c !=
'=' && *c !=
'\'' && *c !=
'\"' && *c !=
'\n' && *c !=
'\r');
289 return m_abbreviation;
301 IF_DEBUG_BUILD(assert(abbreviation !=
' ' && abbreviation !=
'=' && abbreviation !=
'-' 302 && abbreviation !=
'\'' && abbreviation !=
'"' && abbreviation !=
'\n' && abbreviation !=
'\r'));
303 m_abbreviation = abbreviation;
312 return m_environmentVar;
321 m_environmentVar = environmentVariable;
331 return m_description;
341 m_description = description;
372 return m_occurrences[occurrence].values;
390 return m_requiredValueCount;
406 m_requiredValueCount = requiredValueCount;
437 m_valueNames.assign(valueNames);
448 m_valueNames.emplace_back(valueName);
456 return m_requiredValueCount ==
static_cast<std::size_t
>(-1)
457 || (m_occurrences[occurrence].
values.size() >=
static_cast<std::size_t
>(m_requiredValueCount));
475 m_implicit = implicit;
483 return !m_occurrences.empty();
491 return m_occurrences.size();
499 return m_occurrences[occurrence].index;
509 return m_minOccurrences;
519 return m_maxOccurrences;
529 m_minOccurrences = minOccurrences;
530 m_maxOccurrences = maxOccurrences;
536 inline const std::vector<Argument *> &
Argument::path(std::size_t occurrence)
const 538 return m_occurrences[occurrence].path;
552 return m_minOccurrences;
565 if(!m_minOccurrences) {
566 m_minOccurrences = 1;
569 m_minOccurrences = 0;
596 m_combinable = value;
611 return m_denotesOperation;
620 m_denotesOperation = denotesOperation;
630 m_callbackFunction = callback;
652 return !m_subArgs.empty();
686 return m_valueCompletionBehavior;
694 m_valueCompletionBehavior = completionValues;
702 return m_preDefinedCompletionValues;
710 m_preDefinedCompletionValues = preDefinedCompletionValues;
718 m_occurrences.clear();
753 return m_unknownArgBehavior;
763 m_unknownArgBehavior = behavior;
781 m_defaultArg = argument;
791 checkConstraints(m_mainArgs);
800 invokeCallbacks(m_mainArgs);
812 OperationArgument(
const char *name,
char abbreviation =
'\0',
const char *description =
nullptr,
const char *example =
nullptr);
816 Argument(name, abbreviation, description, example)
831 Argument(name, abbreviation, description)
840 #endif // APPLICATION_UTILITIES_ARGUMENTPARSER_H bool isMainArgument() const
Returns an indication whether the argument is used as main argument.
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.
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 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.
std::function< bool(Argument *)> ArgumentPredicate
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.
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.
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()).
#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.
std::function< void(const ArgumentOccurrence &)> CallbackFunction
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.