libpromeki main
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
cmdlineparser.h
Go to the documentation of this file.
1
8#pragma once
9
10#include <variant>
13#include <promeki/core/string.h>
14#include <promeki/core/list.h>
15#include <promeki/core/map.h>
16#include <promeki/core/logger.h>
17
19
45 public:
47 using OptionCallback = std::function<int()>;
48
50 using OptionBoolCallback = std::function<int(bool)>;
51
53 using OptionStringCallback = std::function<int(const String &)>;
54
56 using OptionIntCallback = std::function<int(int)>;
57
59 using OptionDoubleCallback = std::function<int(double)>;
60
67 using OptionCallbackVariant = std::variant<
73
80 class Option {
81 public:
91
92 char shortName = 0;
96
98 Option() = default;
99
107 Option(char sn, const String &ln, const String &d, OptionCallbackVariant cb) :
109
114 ArgType argType() const {
115 if(std::holds_alternative<OptionCallback>(callback)) return ArgNone;
116 if(std::holds_alternative<OptionBoolCallback>(callback)) return ArgBool;
117 if(std::holds_alternative<OptionIntCallback>(callback)) return ArgInt;
118 if(std::holds_alternative<OptionStringCallback>(callback)) return ArgString;
119 if(std::holds_alternative<OptionDoubleCallback>(callback)) return ArgDouble;
120 return ArgUnknown;
121 }
122
123 };
124
133 void registerOptions(const std::initializer_list<Option> &options) {
134 for(const auto &opt : options) {
135 if(opt.shortName != 0) {
136 _optionsMap[String(1, opt.shortName)] = opt;
137 }
138 if(!opt.longName.isEmpty()) {
139 _optionsMap[opt.longName] = opt;
140 }
141 _options.pushToBack(opt);
142 }
143 }
144
146 CmdLineParser() = default;
147
149 void clear() {
150 _optionsMap.clear();
151 _options.clear();
152 _args.clear();
153 return;
154 }
155
166 int parseMain(int argc, char **argv) {
167 StringList args(argc, (const char **)argv);
168 args.remove(0);
169 return parse(args);
170 }
171
182
187 int argCount() const { return _args.size(); }
188
194 const String &arg(int index) const { return _args[index]; }
195
201
202 private:
203 Map<String, Option> _optionsMap;
204 List<Option> _options;
205 StringList _args;
206
213 static String optionFullName(bool optionName, const Option &option);
214};
215
Describes a single command-line option.
Definition cmdlineparser.h:80
ArgType
Enumerates the argument types an option can accept.
Definition cmdlineparser.h:83
@ ArgBool
Boolean argument.
Definition cmdlineparser.h:85
@ ArgDouble
Double argument.
Definition cmdlineparser.h:88
@ ArgNone
No argument required.
Definition cmdlineparser.h:84
@ ArgInt
Integer argument.
Definition cmdlineparser.h:87
@ ArgString
String argument.
Definition cmdlineparser.h:86
@ ArgUnknown
Unknown or unsupported type.
Definition cmdlineparser.h:89
OptionCallbackVariant callback
Typed callback invoked when this option is parsed.
Definition cmdlineparser.h:95
Option()=default
Default constructor.
ArgType argType() const
Returns the argument type inferred from the callback variant.
Definition cmdlineparser.h:114
String longName
Long option name, or empty if none.
Definition cmdlineparser.h:93
Option(char sn, const String &ln, const String &d, OptionCallbackVariant cb)
Constructs an option with all fields.
Definition cmdlineparser.h:107
char shortName
Single-character short option name, or 0 if none.
Definition cmdlineparser.h:92
String desc
Description shown in usage/help text.
Definition cmdlineparser.h:94
Command-line argument parser with callback-driven option handling.
Definition cmdlineparser.h:44
std::function< int()> OptionCallback
Callback for options that take no argument.
Definition cmdlineparser.h:47
std::function< int(int)> OptionIntCallback
Callback for options that take an integer argument.
Definition cmdlineparser.h:56
std::function< int(double)> OptionDoubleCallback
Callback for options that take a double argument.
Definition cmdlineparser.h:59
std::function< int(bool)> OptionBoolCallback
Callback for options that take a boolean argument.
Definition cmdlineparser.h:50
void registerOptions(const std::initializer_list< Option > &options)
Registers a list of options with the parser.
Definition cmdlineparser.h:133
CmdLineParser()=default
Default constructor.
std::variant< OptionCallback, OptionBoolCallback, OptionStringCallback, OptionIntCallback, OptionDoubleCallback > OptionCallbackVariant
Variant type holding any of the supported option callbacks.
Definition cmdlineparser.h:72
int parse(StringList args)
Parses the given argument list against registered options.
int argCount() const
Returns the number of non-option arguments remaining after parsing.
Definition cmdlineparser.h:187
StringList generateUsage() const
Generates usage/help text for all registered options.
std::function< int(const String &)> OptionStringCallback
Callback for options that take a string argument.
Definition cmdlineparser.h:53
const String & arg(int index) const
Returns a non-option argument by index.
Definition cmdlineparser.h:194
void clear()
Clears all registered options, mappings, and collected arguments.
Definition cmdlineparser.h:149
int parseMain(int argc, char **argv)
Parses command-line arguments from main().
Definition cmdlineparser.h:166
Dynamic array container wrapping std::vector.
Definition list.h:40
Iterator remove(ConstIterator pos)
Removes the element at the given iterator position.
Definition list.h:402
size_t size() const noexcept
Returns the number of elements in the list.
Definition list.h:301
void clear() noexcept
Removes all elements from the list.
Definition list.h:330
void pushToBack(const T &value)
Pushes an item onto the back of the list.
Definition list.h:455
bool isEmpty() const noexcept
Returns true if the list has no elements.
Definition list.h:296
Manages a list of strings.
Definition stringlist.h:21
Encoding-aware string class with copy-on-write semantics.
Definition string.h:35
#define PROMEKI_NAMESPACE_BEGIN
Starts a promeki namespace block.
Definition namespace.h:14
#define PROMEKI_NAMESPACE_END
Ends a promeki namespace block.
Definition namespace.h:19