feat: show usage on unknown arg (#767)

This commit is contained in:
stduhpf 2025-09-01 15:38:34 +02:00 committed by GitHub
parent f0fa7ddc40
commit 4c6475f917
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -297,10 +297,12 @@ bool parse_options(int argc, const char** argv, ArgOptions& options) {
bool invalid_arg = false;
std::string arg;
for (int i = 1; i < argc; i++) {
bool found_arg = false;
arg = argv[i];
for (auto& option : options.string_options) {
if ((option.short_name.size() > 0 && arg == option.short_name) || (option.long_name.size() > 0 && arg == option.long_name)) {
found_arg = true;
if (++i >= argc) {
invalid_arg = true;
break;
@ -314,6 +316,7 @@ bool parse_options(int argc, const char** argv, ArgOptions& options) {
for (auto& option : options.int_options) {
if ((option.short_name.size() > 0 && arg == option.short_name) || (option.long_name.size() > 0 && arg == option.long_name)) {
found_arg = true;
if (++i >= argc) {
invalid_arg = true;
break;
@ -327,6 +330,7 @@ bool parse_options(int argc, const char** argv, ArgOptions& options) {
for (auto& option : options.float_options) {
if ((option.short_name.size() > 0 && arg == option.short_name) || (option.long_name.size() > 0 && arg == option.long_name)) {
found_arg = true;
if (++i >= argc) {
invalid_arg = true;
break;
@ -340,6 +344,7 @@ bool parse_options(int argc, const char** argv, ArgOptions& options) {
for (auto& option : options.bool_options) {
if ((option.short_name.size() > 0 && arg == option.short_name) || (option.long_name.size() > 0 && arg == option.long_name)) {
found_arg = true;
if (option.keep_true) {
*option.target = true;
} else {
@ -353,6 +358,7 @@ bool parse_options(int argc, const char** argv, ArgOptions& options) {
for (auto& option : options.manual_options) {
if ((option.short_name.size() > 0 && arg == option.short_name) || (option.long_name.size() > 0 && arg == option.long_name)) {
found_arg = true;
int ret = option.cb(argc, argv, i);
if (ret < 0) {
invalid_arg = true;
@ -364,6 +370,10 @@ bool parse_options(int argc, const char** argv, ArgOptions& options) {
if (invalid_arg) {
break;
}
if (!found_arg) {
fprintf(stderr, "error: unknown argument: %s\n", arg.c_str());
return false;
}
}
if (invalid_arg) {
fprintf(stderr, "error: invalid parameter for argument: %s\n", arg.c_str());