Skip to content

Commit 4c6475f

Browse files
authored
feat: show usage on unknown arg (#767)
1 parent f0fa7dd commit 4c6475f

File tree

1 file changed

+10
-0
lines changed

1 file changed

+10
-0
lines changed

examples/cli/main.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,10 +297,12 @@ bool parse_options(int argc, const char** argv, ArgOptions& options) {
297297
bool invalid_arg = false;
298298
std::string arg;
299299
for (int i = 1; i < argc; i++) {
300+
bool found_arg = false;
300301
arg = argv[i];
301302

302303
for (auto& option : options.string_options) {
303304
if ((option.short_name.size() > 0 && arg == option.short_name) || (option.long_name.size() > 0 && arg == option.long_name)) {
305+
found_arg = true;
304306
if (++i >= argc) {
305307
invalid_arg = true;
306308
break;
@@ -314,6 +316,7 @@ bool parse_options(int argc, const char** argv, ArgOptions& options) {
314316

315317
for (auto& option : options.int_options) {
316318
if ((option.short_name.size() > 0 && arg == option.short_name) || (option.long_name.size() > 0 && arg == option.long_name)) {
319+
found_arg = true;
317320
if (++i >= argc) {
318321
invalid_arg = true;
319322
break;
@@ -327,6 +330,7 @@ bool parse_options(int argc, const char** argv, ArgOptions& options) {
327330

328331
for (auto& option : options.float_options) {
329332
if ((option.short_name.size() > 0 && arg == option.short_name) || (option.long_name.size() > 0 && arg == option.long_name)) {
333+
found_arg = true;
330334
if (++i >= argc) {
331335
invalid_arg = true;
332336
break;
@@ -340,6 +344,7 @@ bool parse_options(int argc, const char** argv, ArgOptions& options) {
340344

341345
for (auto& option : options.bool_options) {
342346
if ((option.short_name.size() > 0 && arg == option.short_name) || (option.long_name.size() > 0 && arg == option.long_name)) {
347+
found_arg = true;
343348
if (option.keep_true) {
344349
*option.target = true;
345350
} else {
@@ -353,6 +358,7 @@ bool parse_options(int argc, const char** argv, ArgOptions& options) {
353358

354359
for (auto& option : options.manual_options) {
355360
if ((option.short_name.size() > 0 && arg == option.short_name) || (option.long_name.size() > 0 && arg == option.long_name)) {
361+
found_arg = true;
356362
int ret = option.cb(argc, argv, i);
357363
if (ret < 0) {
358364
invalid_arg = true;
@@ -364,6 +370,10 @@ bool parse_options(int argc, const char** argv, ArgOptions& options) {
364370
if (invalid_arg) {
365371
break;
366372
}
373+
if (!found_arg) {
374+
fprintf(stderr, "error: unknown argument: %s\n", arg.c_str());
375+
return false;
376+
}
367377
}
368378
if (invalid_arg) {
369379
fprintf(stderr, "error: invalid parameter for argument: %s\n", arg.c_str());

0 commit comments

Comments
 (0)