From e247da507f08aacff7ee3cab4eefbaa2580eb972 Mon Sep 17 00:00:00 2001 From: Carwyn Nelson Date: Tue, 13 Jun 2023 16:03:03 +0100 Subject: [PATCH] LibCore: Add new String variants to ArgsParser This commit adds the ability to use the String class with `add_option` and `add_positional_argument`. This should help with the transition away from DeprecatedString. --- Userland/Libraries/LibCore/ArgsParser.cpp | 40 +++++++++++++++++++++++ Userland/Libraries/LibCore/ArgsParser.h | 2 ++ 2 files changed, 42 insertions(+) diff --git a/Userland/Libraries/LibCore/ArgsParser.cpp b/Userland/Libraries/LibCore/ArgsParser.cpp index aa3d0be53d..8e8f09c98e 100644 --- a/Userland/Libraries/LibCore/ArgsParser.cpp +++ b/Userland/Libraries/LibCore/ArgsParser.cpp @@ -430,6 +430,27 @@ void ArgsParser::add_option(DeprecatedString& value, char const* help_string, ch add_option(move(option)); } +void ArgsParser::add_option(String& value, char const* help_string, char const* long_name, char short_name, char const* value_name, OptionHideMode hide_mode) +{ + Option option { + OptionArgumentMode::Required, + help_string, + long_name, + short_name, + value_name, + [&value](StringView s) { + auto value_or_error = String::from_utf8(s); + if (value_or_error.is_error()) + return false; + + value = value_or_error.release_value(); + return true; + }, + hide_mode, + }; + add_option(move(option)); +} + void ArgsParser::add_option(StringView& value, char const* help_string, char const* long_name, char short_name, char const* value_name, OptionHideMode hide_mode) { Option option { @@ -610,6 +631,25 @@ void ArgsParser::add_positional_argument(StringView& value, char const* help_str add_positional_argument(move(arg)); } +void ArgsParser::add_positional_argument(String& value, char const* help_string, char const* name, Required required) +{ + Arg arg { + help_string, + name, + required == Required::Yes ? 1 : 0, + 1, + [&value](StringView s) { + auto value_or_error = String::from_utf8(s); + if (value_or_error.is_error()) + return false; + + value = value_or_error.release_value(); + return true; + } + }; + add_positional_argument(move(arg)); +} + template void ArgsParser::add_positional_argument(I& value, char const* help_string, char const* name, Required required) { diff --git a/Userland/Libraries/LibCore/ArgsParser.h b/Userland/Libraries/LibCore/ArgsParser.h index 5c30ff68de..8450c0d75b 100644 --- a/Userland/Libraries/LibCore/ArgsParser.h +++ b/Userland/Libraries/LibCore/ArgsParser.h @@ -88,6 +88,7 @@ public: void add_ignored(char const* long_name, char short_name, OptionHideMode hide_mode = OptionHideMode::None); void add_option(bool& value, char const* help_string, char const* long_name, char short_name, OptionHideMode hide_mode = OptionHideMode::None); void add_option(DeprecatedString& value, char const* help_string, char const* long_name, char short_name, char const* value_name, OptionHideMode hide_mode = OptionHideMode::None); + void add_option(String& value, char const* help_string, char const* long_name, char short_name, char const* value_name, OptionHideMode hide_mode = OptionHideMode::None); void add_option(StringView& value, char const* help_string, char const* long_name, char short_name, char const* value_name, OptionHideMode hide_mode = OptionHideMode::None); template void add_option(I& value, char const* help_string, char const* long_name, char short_name, char const* value_name, OptionHideMode hide_mode = OptionHideMode::None); @@ -102,6 +103,7 @@ public: void add_positional_argument(Arg&&); void add_positional_argument(DeprecatedString& value, char const* help_string, char const* name, Required required = Required::Yes); void add_positional_argument(StringView& value, char const* help_string, char const* name, Required required = Required::Yes); + void add_positional_argument(String& value, char const* help_string, char const* name, Required required = Required::Yes); template void add_positional_argument(I& value, char const* help_string, char const* name, Required required = Required::Yes); void add_positional_argument(double& value, char const* help_string, char const* name, Required required = Required::Yes);