mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 23:07:35 +00:00
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.
This commit is contained in:
parent
64ca546a06
commit
b65258c093
9 changed files with 149 additions and 125 deletions
|
@ -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();
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue