7#include "utility/module.hpp"
8#include "generator.hpp"
13namespace hi::inline
v1 {
17 std::optional<std::string> argument;
22 std::optional<std::string> argument;
33using cmdline_option = std::variant<cmline_executable, cmdline_short_option, cmdline_long_option, cmdline_argument>;
70 co_yield cmdln_option::executable{*it};
74 char32_t short_option_name = 0;
75 for (; it != last; ++it) {
76 if (short_option_name) {
78 co_yield cmdln_short_option{short_option_name, *it};
79 short_option_name = 0;
81 }
else if (*it ==
"--") {
84 }
else if (it->starts_with(
"--")) {
86 hilet eq_index = it->find(
'=');
87 if (eq_index == std::string::npos) {
89 co_yield cmdln_long_option{it->substr(2), {}};
94 hilet name_length = eq_index - 2;
95 co_yield cmdln_long_option(it->substr(2, name_length), it->substr(eq_index + 1));
98 }
else if (it.front() ==
'-' or it.front() ==
'+') {
101 hilet token = to_u32string(*it);
103 hilet last_c = end(token);
104 negative = it.front() ==
'+';
106 for (
auto jt = first_c; jt != last_c; ++jt) {
110 if (not options_with_arguments_.contains(c)) {
112 co_yield cmdln_short_option(c, {});
116 short_option_name = c;
121 co_yield cmdln_short_option(c,
std::move(argument));
128 co_yield cmdln_non_option{*it};
133 for (; it != last; ++it) {
134 co_yield cmdln_non_option{*it};
137 if (short_option_name) {
138 throw parse_error(
"Missing argument for option -{}", short_option_name);
144 char32_t short_option;
148 hi::notifier<void(std::string_view argument)>
notifier;
171 auto it = begin(option_help);
172 hilet last = end(option_help);
175 static char32_t parse_short_option(std::string_view::iterator &it, std::string_view::iterator last)
177 if (it == last || *it !=
'-') {
178 throw parse_error(
"Expecting '-'");
184 throw parse_error(
"Missing character after '-'");
196#if HI_OPERATING_SYSTEM == HI_OS_WINDOWS
199 void parse(
int argc,
char **argv);
202 template<
typename... Args>
205 return _options.emplace(std::forward<Args>(args)...);
#define hi_assert(expression,...)
Assert if expression is true.
Definition assert.hpp:199
#define hilet
Invariant should be the default for variables.
Definition utility.hpp:23
constexpr std::string to_string(std::u32string_view rhs) noexcept
Conversion from UTF-32 to UTF-8.
Definition to_string.hpp:215
constexpr std::u32string to_u32string(std::u32string_view rhs) noexcept
Identity conversion from UTF-32 to UTF-32.
Definition to_string.hpp:23
DOXYGEN BUG.
Definition algorithm.hpp:13
generator< cmdln_option > command_line_parser(It first, It last, std::string_view options_with_arguments)
A POSIX command line parser.
Definition command_line.hpp:64
Definition command_line.hpp:15
Definition command_line.hpp:20
Definition command_line.hpp:25
Definition command_line.hpp:29
Definition command_line.hpp:142
constexpr command_line_option(std::string_view option_help)
Syntax:
Definition command_line.hpp:169
Command line parser.
Definition command_line.hpp:194
A return value for a generator-function.
Definition generator.hpp:29
A notifier which can be used to call a set of registered callbacks.
Definition notifier.hpp:25