diff --git a/libos/include/os/ArgumentParser.h b/libos/include/os/ArgumentParser.h index 4bbe91ef..8f71024d 100644 --- a/libos/include/os/ArgumentParser.h +++ b/libos/include/os/ArgumentParser.h @@ -15,7 +15,7 @@ class ArgumentParser Result add_value_argument(StringView& out, char short_flag, StringView long_flag, bool value_required); Result add_value_argument(StringView& out, char short_flag, StringView long_flag, StringView fallback); - void parse(int argc, char* const* argv); + Result> parse(int argc, char* const* argv); private: struct PositionalArgument diff --git a/libos/src/ArgumentParser.cpp b/libos/src/ArgumentParser.cpp index c87932d4..6f40619f 100644 --- a/libos/src/ArgumentParser.cpp +++ b/libos/src/ArgumentParser.cpp @@ -49,10 +49,12 @@ static bool looks_like_long_flag(StringView arg) return arg.length() > 2 && arg[0] == '-' && arg[1] == '-'; } -void ArgumentParser::parse(int argc, char* const* argv) +Result> ArgumentParser::parse(int argc, char* const* argv) { StringView program_name = argv[0]; + Vector leftovers; + Option current_value_argument = {}; bool is_parsing_value_argument = false; @@ -144,7 +146,7 @@ void ArgumentParser::parse(int argc, char* const* argv) Option current = m_positional_args.try_dequeue(); if (!current.has_value()) { - fprintf(stderr, "%s: unused argument '%s'\n", program_name.chars(), arg.chars()); + TRY(leftovers.try_append(arg)); continue; } @@ -172,4 +174,6 @@ void ArgumentParser::parse(int argc, char* const* argv) } else { *arg.out = arg.fallback; } } + + return leftovers; }