107 for (
int arg_index = 0; arg_index != argc; ++arg_index) {
110 if (arg_index == 0) {
111 r[
"executable-path"] = argument;
113 }
else if (argument.starts_with(
"--"s)) {
114 ttlet i = argument.find(
'=');
115 if (i == argument.npos) {
116 ttlet option_name = argument.substr(2);
119 return x.name == option_name;
122 if (option == options.
end()) {
123 error_messages.
push_back(fmt::format(
"Unknown option '{}'", option_name));
125 }
else if (option->type != datum_type_t::Boolean) {
126 error_messages.
push_back(fmt::format(
"Option '{}' requires an argument", option_name));
129 r[option_name] =
true;
133 ttlet option_name = argument.substr(2, i-2);
134 ttlet option_value_string = argument.substr(i+1);
137 return x.name == option_name;
140 if (option == options.
end()) {
141 error_messages.
push_back(fmt::format(
"Unknown option '{}'", option_name));
144 switch (option->type) {
145 case datum_type_t::Boolean:
146 if (option_value_string ==
"true") {
147 r[option_name] =
true;
148 }
else if (option_value_string ==
"false") {
149 r[option_name] =
false;
152 fmt::format(
"Expected a boolean value ('true' or 'false') for option '{}' got '{}'", option_name, option_value_string)
157 case datum_type_t::Integer:
158 if (option->enum_conversion) {
159 ttlet option_value_int = option->enum_conversion(option_value_string);
160 if (option_value_int >= 0) {
161 r[option_name] = option_value_int;
164 fmt::format(
"Unknown value '{}' for option '{}'", option_value_string, option_name)
170 ttlet option_value_int =
std::stoll(option_value_string);
171 r[option_name] = option_value_int;
174 fmt::format(
"Expected a integer value for option '{}' got '{}'", option_name, option_value_string)
180 case datum_type_t::String:
181 r[option_name] = option_value_string;
184 case datum_type_t::Vector:
185 r[option_name].push_back(
datum{option_value_string});
188 case datum_type_t::URL:
189 r[option_name] = URL::urlFromCurrentWorkingDirectory().urlByAppendingPath(option_value_string);
199 r[
"arguments"].push_back(argument);