110 auto r =
datum{datum::map{}};
112 for (
int arg_index = 0; arg_index != argc; ++arg_index) {
115 if (arg_index == 0) {
116 r[
"executable-path"] = argument;
118 }
else if (argument.starts_with(
"--"s)) {
119 hilet i = argument.find(
'=');
120 if (i == argument.npos) {
121 hilet option_name = argument.substr(2);
124 return x.name == option_name;
127 if (option == options.
end()) {
128 error_messages.
push_back(std::format(
"Unknown option '{}'", option_name));
130 }
else if (option->type != datum_type_t::Boolean) {
131 error_messages.
push_back(std::format(
"Option '{}' requires an argument", option_name));
134 r[option_name] =
true;
138 hilet option_name = argument.substr(2, i - 2);
139 hilet option_value_string = argument.substr(i + 1);
142 return x.name == option_name;
145 if (option == options.
end()) {
146 error_messages.
push_back(std::format(
"Unknown option '{}'", option_name));
149 switch (option->type) {
150 case datum_type_t::Boolean:
151 if (option_value_string ==
"true") {
152 r[option_name] =
true;
153 }
else if (option_value_string ==
"false") {
154 r[option_name] =
false;
157 "Expected a boolean value ('true' or 'false') for option '{}' got '{}'",
159 option_value_string));
163 case datum_type_t::Integer:
164 if (option->enum_conversion) {
165 hilet option_value_int = option->enum_conversion(option_value_string);
166 if (option_value_int >= 0) {
167 r[option_name] = option_value_int;
170 std::format(
"Unknown value '{}' for option '{}'", option_value_string, option_name));
176 r[option_name] = option_value_int;
179 "Expected a integer value for option '{}' got '{}'", option_name, option_value_string));
184 case datum_type_t::String: r[option_name] = option_value_string;
break;
186 case datum_type_t::Vector: r[option_name].push_back(
datum{option_value_string});
break;
188 case datum_type_t::URL:
189 r[option_name] = URL::urlFromCurrentWorkingDirectory().urlByAppendingPath(option_value_string);
192 default: hi_no_default();
198 r[
"arguments"].push_back(argument);