mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 08:37:45 +00:00
LibCore: Introduce support for optional ArgsParser option values
This commit is contained in:
parent
3d51642037
commit
a85b728768
2 changed files with 19 additions and 7 deletions
|
@ -60,7 +60,7 @@ bool ArgsParser::parse(int argc, char* const* argv, FailureBehavior failure_beha
|
||||||
if (opt.long_name) {
|
if (opt.long_name) {
|
||||||
option long_opt {
|
option long_opt {
|
||||||
opt.long_name,
|
opt.long_name,
|
||||||
opt.argument_mode == OptionArgumentMode::Required ? required_argument : no_argument,
|
opt.argument_mode == OptionArgumentMode::Required ? required_argument : (opt.argument_mode == OptionArgumentMode::Optional ? optional_argument : no_argument),
|
||||||
&index_of_found_long_option,
|
&index_of_found_long_option,
|
||||||
static_cast<int>(i)
|
static_cast<int>(i)
|
||||||
};
|
};
|
||||||
|
@ -70,6 +70,9 @@ bool ArgsParser::parse(int argc, char* const* argv, FailureBehavior failure_beha
|
||||||
short_options_builder.append(opt.short_name);
|
short_options_builder.append(opt.short_name);
|
||||||
if (opt.argument_mode != OptionArgumentMode::None)
|
if (opt.argument_mode != OptionArgumentMode::None)
|
||||||
short_options_builder.append(':');
|
short_options_builder.append(':');
|
||||||
|
// Note: This is a GNU extension.
|
||||||
|
if (opt.argument_mode == OptionArgumentMode::Optional)
|
||||||
|
short_options_builder.append(':');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
long_options.append({ 0, 0, 0, 0 });
|
long_options.append({ 0, 0, 0, 0 });
|
||||||
|
@ -202,6 +205,8 @@ void ArgsParser::print_usage_terminal(FILE* file, char const* argv0)
|
||||||
continue;
|
continue;
|
||||||
if (opt.argument_mode == OptionArgumentMode::Required)
|
if (opt.argument_mode == OptionArgumentMode::Required)
|
||||||
out(file, " [{} {}]", opt.name_for_display(), opt.value_name);
|
out(file, " [{} {}]", opt.name_for_display(), opt.value_name);
|
||||||
|
else if (opt.argument_mode == OptionArgumentMode::Optional)
|
||||||
|
out(file, " [{}[{}{}]]", opt.name_for_display(), opt.long_name ? "="sv : ""sv, opt.value_name);
|
||||||
else
|
else
|
||||||
out(file, " [{}]", opt.name_for_display());
|
out(file, " [{}]", opt.name_for_display());
|
||||||
}
|
}
|
||||||
|
@ -231,22 +236,24 @@ void ArgsParser::print_usage_terminal(FILE* file, char const* argv0)
|
||||||
if (opt.hide_mode == OptionHideMode::CommandLineAndMarkdown)
|
if (opt.hide_mode == OptionHideMode::CommandLineAndMarkdown)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
auto print_argument = [&]() {
|
auto print_argument = [&](StringView value_delimiter) {
|
||||||
if (opt.value_name) {
|
if (opt.value_name) {
|
||||||
if (opt.argument_mode == OptionArgumentMode::Required)
|
if (opt.argument_mode == OptionArgumentMode::Required)
|
||||||
out(file, " {}", opt.value_name);
|
out(file, " {}", opt.value_name);
|
||||||
|
if (opt.argument_mode == OptionArgumentMode::Optional)
|
||||||
|
out(file, "[{}{}]", value_delimiter, opt.value_name);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
out(file, "\t");
|
out(file, "\t");
|
||||||
if (opt.short_name) {
|
if (opt.short_name) {
|
||||||
out(file, "\033[1m-{}\033[0m", opt.short_name);
|
out(file, "\033[1m-{}\033[0m", opt.short_name);
|
||||||
print_argument();
|
print_argument(""sv);
|
||||||
}
|
}
|
||||||
if (opt.short_name && opt.long_name)
|
if (opt.short_name && opt.long_name)
|
||||||
out(file, ", ");
|
out(file, ", ");
|
||||||
if (opt.long_name) {
|
if (opt.long_name) {
|
||||||
out(file, "\033[1m--{}\033[0m", opt.long_name);
|
out(file, "\033[1m--{}\033[0m", opt.long_name);
|
||||||
print_argument();
|
print_argument("="sv);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (opt.help_string)
|
if (opt.help_string)
|
||||||
|
@ -279,6 +286,8 @@ void ArgsParser::print_usage_markdown(FILE* file, char const* argv0)
|
||||||
// currently display a blank name after the option.
|
// currently display a blank name after the option.
|
||||||
if (opt.argument_mode == OptionArgumentMode::Required)
|
if (opt.argument_mode == OptionArgumentMode::Required)
|
||||||
out(file, " [{} {}]", opt.name_for_display(), opt.value_name ?: "");
|
out(file, " [{} {}]", opt.name_for_display(), opt.value_name ?: "");
|
||||||
|
else if (opt.argument_mode == OptionArgumentMode::Optional)
|
||||||
|
out(file, " [{}[{}{}]]", opt.name_for_display(), opt.long_name ? "="sv : ""sv, opt.value_name);
|
||||||
else
|
else
|
||||||
out(file, " [{}]", opt.name_for_display());
|
out(file, " [{}]", opt.name_for_display());
|
||||||
}
|
}
|
||||||
|
@ -318,23 +327,25 @@ void ArgsParser::print_usage_markdown(FILE* file, char const* argv0)
|
||||||
if (!should_display_option(opt))
|
if (!should_display_option(opt))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
auto print_argument = [&]() {
|
auto print_argument = [&](StringView value_delimiter) {
|
||||||
if (opt.value_name != nullptr) {
|
if (opt.value_name != nullptr) {
|
||||||
if (opt.argument_mode == OptionArgumentMode::Required)
|
if (opt.argument_mode == OptionArgumentMode::Required)
|
||||||
out(file, " {}", opt.value_name);
|
out(file, " {}", opt.value_name);
|
||||||
|
if (opt.argument_mode == OptionArgumentMode::Optional)
|
||||||
|
out(file, "[{}{}]", value_delimiter, opt.value_name);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
out(file, "* ");
|
out(file, "* ");
|
||||||
if (opt.short_name != '\0') {
|
if (opt.short_name != '\0') {
|
||||||
out(file, "`-{}", opt.short_name);
|
out(file, "`-{}", opt.short_name);
|
||||||
print_argument();
|
print_argument(""sv);
|
||||||
out(file, "`");
|
out(file, "`");
|
||||||
}
|
}
|
||||||
if (opt.short_name != '\0' && opt.long_name != nullptr)
|
if (opt.short_name != '\0' && opt.long_name != nullptr)
|
||||||
out(file, ", ");
|
out(file, ", ");
|
||||||
if (opt.long_name != nullptr) {
|
if (opt.long_name != nullptr) {
|
||||||
out(file, "`--{}", opt.long_name);
|
out(file, "`--{}", opt.long_name);
|
||||||
print_argument();
|
print_argument("="sv);
|
||||||
out(file, "`");
|
out(file, "`");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,7 @@ public:
|
||||||
|
|
||||||
enum class OptionArgumentMode {
|
enum class OptionArgumentMode {
|
||||||
None,
|
None,
|
||||||
|
Optional,
|
||||||
Required,
|
Required,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue