11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
22PROMEKI_NAMESPACE_BEGIN
57 using OptionCallback = Function<int()>;
60 using OptionBoolCallback = Function<int(
bool)>;
63 using OptionStringCallback = Function<int(
const String &)>;
66 using OptionIntCallback = Function<int(
int)>;
69 using OptionDoubleCallback = Function<int(
double)>;
77 using OptionCallbackVariant = std::variant<OptionCallback, OptionBoolCallback, OptionStringCallback,
78 OptionIntCallback, OptionDoubleCallback>;
101 OptionCallbackVariant callback;
113 Option(
char sn,
const String &ln,
const String &d, OptionCallbackVariant cb)
114 : shortName(sn), longName(ln), desc(d), callback(cb) {}
120 ArgType argType()
const {
121 if (std::holds_alternative<OptionCallback>(callback))
return ArgNone;
122 if (std::holds_alternative<OptionBoolCallback>(callback))
return ArgBool;
123 if (std::holds_alternative<OptionIntCallback>(callback))
return ArgInt;
124 if (std::holds_alternative<OptionStringCallback>(callback))
return ArgString;
125 if (std::holds_alternative<OptionDoubleCallback>(callback))
return ArgDouble;
138 void registerOptions(
const std::initializer_list<Option> &options) {
139 for (
const auto &opt : options) {
140 if (opt.shortName != 0) {
141 _optionsMap[String(1, opt.shortName)] = opt;
143 if (!opt.longName.isEmpty()) {
144 _optionsMap[opt.longName] = opt;
146 _options.pushToBack(opt);
151 CmdLineParser() =
default;
174 int parseMain(
int argc,
char **argv) {
176 if (argc > 1) args.reserve(
static_cast<size_t>(argc - 1));
177 for (
int i = 1; i < argc; ++i) {
178 const char *a = argv[i] ? argv[i] :
"";
180 while (a[len]) ++len;
181 args.pushToBack(String::fromUtf8(a, len));
195 int parse(StringList args);
201 int argCount()
const {
return _args.size(); }
208 const String &arg(
int index)
const {
return _args[index]; }
214 StringList generateUsage()
const;
217 Map<String, Option> _optionsMap;
218 List<Option> _options;
227 static String optionFullName(
bool optionName,
const Option &option);