107 int argumentCount = 0;
108 for (ttlet &argument: arguments) {
109 if (argumentCount++ == 0) {
110 r[
"executable-path"] = arguments[0];
112 }
else if (argument.starts_with(
"--"s)) {
113 ttlet i = argument.find(
'=');
114 if (i == argument.npos) {
115 ttlet option_name = argument.substr(2);
118 return x.name == option_name;
121 if (option == options.
end()) {
122 error_messages.
push_back(fmt::format(
"Unknown option '{}'", option_name));
124 }
else if (option->type != datum_type_t::Boolean) {
125 error_messages.
push_back(fmt::format(
"Option '{}' requires an argument", option_name));
128 r[option_name] =
true;
132 ttlet option_name = argument.substr(2, i-2);
133 ttlet option_value_string = argument.substr(i+1);
136 return x.name == option_name;
139 if (option == options.
end()) {
140 error_messages.
push_back(fmt::format(
"Unknown option '{}'", option_name));
143 switch (option->type) {
144 case datum_type_t::Boolean:
145 if (option_value_string ==
"true") {
146 r[option_name] =
true;
147 }
else if (option_value_string ==
"false") {
148 r[option_name] =
false;
151 fmt::format(
"Expected a boolean value ('true' or 'false') for option '{}' got '{}'", option_name, option_value_string)
156 case datum_type_t::Integer:
157 if (option->enum_conversion) {
158 ttlet option_value_int = option->enum_conversion(option_value_string);
159 if (option_value_int >= 0) {
160 r[option_name] = option_value_int;
163 fmt::format(
"Unknown value '{}' for option '{}'", option_value_string, option_name)
169 ttlet option_value_int =
std::stoll(option_value_string);
170 r[option_name] = option_value_int;
173 fmt::format(
"Expected a integer value for option '{}' got '{}'", option_name, option_value_string)
179 case datum_type_t::String:
180 r[option_name] = option_value_string;
183 case datum_type_t::Vector:
184 r[option_name].push_back(
datum{option_value_string});
187 case datum_type_t::URL:
188 r[option_name] = URL::urlFromCurrentWorkingDirectory().urlByAppendingPath(option_value_string);
198 r[
"arguments"].push_back(argument);