From 23a87a41ff16e0197b77ba1f80a75dec48addd19 Mon Sep 17 00:00:00 2001 From: Kenneth Myhra Date: Fri, 25 Mar 2022 22:11:05 +0100 Subject: [PATCH] LibCore: Add Vector variant of add_option() This adds a Vector variant of add_option(). The signature includes a separator parameter which defaults to ','. --- Userland/Libraries/LibCore/ArgsParser.cpp | 26 +++++++++++++++++++++++ Userland/Libraries/LibCore/ArgsParser.h | 1 + 2 files changed, 27 insertions(+) diff --git a/Userland/Libraries/LibCore/ArgsParser.cpp b/Userland/Libraries/LibCore/ArgsParser.cpp index a41ae6cda2..e351cf46b4 100644 --- a/Userland/Libraries/LibCore/ArgsParser.cpp +++ b/Userland/Libraries/LibCore/ArgsParser.cpp @@ -520,6 +520,32 @@ void ArgsParser::add_option(Optional& value, const char* help_string, co add_option(move(option)); } +void ArgsParser::add_option(Vector& values, char const* help_string, char const* long_name, char short_name, char const* value_name, char separator, bool hidden) +{ + Option option { + true, + help_string, + long_name, + short_name, + value_name, + [&values, separator](char const* s) { + bool parsed_all_values = true; + + StringView { s }.for_each_split_view(separator, false, [&](auto value) { + if (auto maybe_value = AK::StringUtils::convert_to_uint(value); maybe_value.has_value()) + values.append(*maybe_value); + else + parsed_all_values = false; + }); + + return parsed_all_values; + }, + hidden + }; + + add_option(move(option)); +} + void ArgsParser::add_positional_argument(Arg&& arg) { m_positional_args.append(move(arg)); diff --git a/Userland/Libraries/LibCore/ArgsParser.h b/Userland/Libraries/LibCore/ArgsParser.h index bbb5489f74..3abe849175 100644 --- a/Userland/Libraries/LibCore/ArgsParser.h +++ b/Userland/Libraries/LibCore/ArgsParser.h @@ -80,6 +80,7 @@ public: void add_option(double& value, char const* help_string, char const* long_name, char short_name, char const* value_name, bool hidden = false); void add_option(Optional& value, char const* help_string, char const* long_name, char short_name, char const* value_name, bool hidden = false); void add_option(Optional& value, char const* help_string, char const* long_name, char short_name, char const* value_name, bool hidden = false); + void add_option(Vector& values, char const* help_string, char const* long_name, char short_name, char const* value_name, char separator = ',', bool hidden = false); void add_positional_argument(Arg&&); void add_positional_argument(char const*& value, char const* help_string, char const* name, Required required = Required::Yes);