diff options
author | kleines Filmröllchen <filmroellchen@serenityos.org> | 2022-07-12 20:23:28 +0200 |
---|---|---|
committer | Linus Groh <mail@linusgroh.de> | 2022-12-11 16:05:23 +0000 |
commit | b65258c093a14a8bac082aa3580ae70b78f92283 (patch) | |
tree | ce644524fe8534f579ea06522802b18a6aba5392 /Userland/Applications/Help/main.cpp | |
parent | 64ca546a06c7bfd0ad1d75beb068aa63d90282ac (diff) | |
download | serenity-b65258c093a14a8bac082aa3580ae70b78f92283.zip |
Help+man+LibManual: Move argument handling to LibManual
This deduplicates argument handling logic from Help and man and makes it
more modular for future use cases. The argument handling works as
before: two arguments specify section and page (in this order), one
argument specifies either a page (the first section that it's found in
is used) or a path to a manpage markdown file.
Diffstat (limited to 'Userland/Applications/Help/main.cpp')
-rw-r--r-- | Userland/Applications/Help/main.cpp | 65 |
1 files changed, 20 insertions, 45 deletions
diff --git a/Userland/Applications/Help/main.cpp b/Userland/Applications/Help/main.cpp index 3ae157664b..ec4c867387 100644 --- a/Userland/Applications/Help/main.cpp +++ b/Userland/Applications/Help/main.cpp @@ -2,6 +2,7 @@ * Copyright (c) 2019-2020, Sergey Bugaev <bugaevc@serenityos.org> * Copyright (c) 2021, Andreas Kling <kling@serenityos.org> * Copyright (c) 2021, Sam Atkins <atkinssj@serenityos.org> + * Copyright (c) 2022, kleines Filmröllchen <filmroellchen@serenityos.org> * * SPDX-License-Identifier: BSD-2-Clause */ @@ -17,15 +18,6 @@ using namespace Help; -static DeprecatedString parse_input(StringView input) -{ - AK::URL url = URL::create_with_url_or_path(input); - if (url.is_valid()) - return url.basename(); - - return input; -} - ErrorOr<int> serenity_main(Main::Arguments arguments) { TRY(Core::System::pledge("stdio recvfd sendfd rpath unix")); @@ -40,44 +32,27 @@ ErrorOr<int> serenity_main(Main::Arguments arguments) TRY(Core::System::unveil("/tmp/session/%sid/portal/webcontent", "rw")); TRY(Core::System::unveil(nullptr, nullptr)); - DeprecatedString start_page; - u32 section = 0; + DeprecatedString first_query_parameter; + DeprecatedString second_query_parameter; Core::ArgsParser args_parser; - // FIXME: These custom Args are a hack. What we want to do is have an optional int arg, then an optional string. - // However, when only a string is provided, it gets forwarded to the int argument since that is first, and - // parsing fails. This hack instead forwards it to the start_page in that case. - args_parser.add_positional_argument(Core::ArgsParser::Arg { - .help_string = "Section of the man page", - .name = "section", - .min_values = 0, - .max_values = 1, - .accept_value = [&](char const* input_ptr) { - StringView input { input_ptr, strlen(input_ptr) }; - // If it's a number, use it as the section - if (auto number = input.to_int(); number.has_value()) { - section = number.value(); - return true; - } - - // Otherwise, use it as the start_page - start_page = parse_input(input); - return true; - } }); - args_parser.add_positional_argument(Core::ArgsParser::Arg { - .help_string = "Help page to open. Either an absolute path to the markdown file, or a search query", - .name = "page", - .min_values = 0, - .max_values = 1, - .accept_value = [&](char const* input_ptr) { - StringView input { input_ptr, strlen(input_ptr) }; - // If start_page was already set by our section arg, then it can't be set again - if (!start_page.is_empty()) - return false; - start_page = parse_input(input); - return true; - } }); + // The actual "page query" parsing happens when we set the main widget's start page. + args_parser.add_positional_argument( + first_query_parameter, + "Section of the man page", + "section", + Core::ArgsParser::Required::No); + args_parser.add_positional_argument( + second_query_parameter, + "Help page to open. Either an absolute path to the markdown file, or a search query", + "page", + Core::ArgsParser::Required::No); args_parser.parse(arguments); + Vector<StringView, 2> query_parameters; + if (!first_query_parameter.is_empty()) + query_parameters.append(first_query_parameter); + if (!second_query_parameter.is_empty()) + query_parameters.append(second_query_parameter); auto app_icon = GUI::Icon::default_icon("app-help"sv); @@ -88,7 +63,7 @@ ErrorOr<int> serenity_main(Main::Arguments arguments) auto main_widget = TRY(window->try_set_main_widget<MainWidget>()); TRY(main_widget->initialize_fallibles(window)); - TRY(main_widget->set_start_page(start_page, section)); + TRY(main_widget->set_start_page(query_parameters)); window->show(); |