51 if(i.has_value() && !
options[*i].values.empty())
52 return options[*i].values.front();
66 "unknown command line option", option);
77 options[*i].values.push_back(value);
82 "unknown command line option", option);
102 if(i.has_value() && !
options[*i].values.empty())
103 return options[*i].values.front();
109 const std::string &option)
const
119 std::list<std::string>
122 std::list<std::string> separated_values;
124 if(i.has_value() && !
options[*i].values.empty())
126 std::istringstream values_stream(
options[*i].values.front());
127 std::string single_value;
128 while(std::getline(values_stream, single_value,
','))
130 separated_values.push_back(single_value);
133 return separated_values;
138 for(std::size_t i=0; i<
options.size(); i++)
147 for(std::size_t i=0; i<
options.size(); i++)
148 if(
options[i].optstring==option)
158 while(optstring[0]!=0)
163 optstring[0] !=
':',
"cmdlinet::parse: Invalid option string\n");
165 if(optstring[0]==
'(')
172 for(optstring++; optstring[0]!=
')' && optstring[0]!=0; optstring++)
175 if(optstring[0]==
')')
188 if(optstring[0]==
':')
199 for(
int i=1; i<argc; i++)
202 args.push_back(argv[i]);
207 if(argv[i][1]!=0 && argv[i][2]==0)
209 else if(argv[i][1]==
'-')
217 if(!optnr.has_value())
221 if(!optnr.has_value())
231 if(argv[i][2]==0 ||
options[*optnr].islong)
236 if(argv[i][0]==
'-' && argv[i][1]!=0)
238 options[*optnr].values.push_back(argv[i]);
241 options[*optnr].values.push_back(argv[i]+2);
254 std::vector<std::string>
259 std::size_t distance;
260 std::string suggestion;
262 bool operator<(
const suggestiont &other)
const
264 return distance < other.distance;
268 auto argument_suggestions = std::vector<suggestiont>{};
273 for(
const auto &option :
options)
277 const auto long_name =
"--" + option.optstring;
278 if(
auto distance = argument_matcher.get_edit_distance(long_name))
280 argument_suggestions.push_back({distance.value(), long_name});
285 const auto short_name = std::string{
"-"} + option.optchar;
286 if(
auto distance = argument_matcher.get_edit_distance(short_name))
288 argument_suggestions.push_back({distance.value(), short_name});
293 auto final_suggestions = std::vector<std::string>{};
294 if(!argument_suggestions.empty())
298 auto min = std::min_element(
299 argument_suggestions.begin(), argument_suggestions.end());
301 min != argument_suggestions.end(),
302 "there is a minimum because it's not empty");
303 for(
auto const &suggestion : argument_suggestions)
305 if(suggestion.distance == min->distance)
307 final_suggestions.push_back(suggestion.suggestion);
311 return final_suggestions;
317 : command_line(command_line), index(index)
327 goto_next_valid_index();
341 while(index < command_line->
options.size() && !is_valid_index())
363 return index == other.
index;
370 return index != other.
index;