106 int argumentCount = 0;
107 for (ttlet &argument: arguments) {
108 if (argumentCount++ == 0) {
109 r[
"executable-path"] = arguments[0];
111 }
else if (starts_with(argument,
"--"s)) {
112 ttlet i = argument.find(
'=');
113 if (i == argument.npos) {
114 ttlet option_name = argument.substr(2);
117 return x.name == option_name;
120 if (option == options.
end()) {
121 error_messages.
push_back(fmt::format(
"Unknown option '{}'", option_name));
123 }
else if (option->type != datum_type_t::Boolean) {
124 error_messages.
push_back(fmt::format(
"Option '{}' requires an argument", option_name));
127 r[option_name] =
true;
131 ttlet option_name = argument.substr(2, i-2);
132 ttlet option_value_string = argument.substr(i+1);
135 return x.name == option_name;
138 if (option == options.
end()) {
139 error_messages.
push_back(fmt::format(
"Unknown option '{}'", option_name));
142 switch (option->type) {
143 case datum_type_t::Boolean:
144 if (option_value_string ==
"true") {
145 r[option_name] =
true;
146 }
else if (option_value_string ==
"false") {
147 r[option_name] =
false;
150 fmt::format(
"Expected a boolean value ('true' or 'false') for option '{}' got '{}'", option_name, option_value_string)
155 case datum_type_t::Integer:
156 if (option->enum_conversion) {
157 ttlet option_value_int = option->enum_conversion(option_value_string);
158 if (option_value_int >= 0) {
159 r[option_name] = option_value_int;
162 fmt::format(
"Unknown value '{}' for option '{}'", option_value_string, option_name)
168 ttlet option_value_int =
std::stoll(option_value_string);
169 r[option_name] = option_value_int;
172 fmt::format(
"Expected a integer value for option '{}' got '{}'", option_name, option_value_string)
178 case datum_type_t::String:
179 r[option_name] = option_value_string;
182 case datum_type_t::Vector:
183 r[option_name].push_back(
datum{option_value_string});
186 case datum_type_t::URL:
187 r[option_name] = URL::urlFromCurrentWorkingDirectory().urlByAppendingPath(option_value_string);
197 r[
"arguments"].push_back(argument);