Sort help message flags by required field (#16476)

closes #16462.

The --help flag will now appear after all required flags in help
messages.

## Release notes summary - What our users need to know
N/A

## Tasks after submitting
N/A
This commit is contained in:
uraneko
2025-08-21 10:46:29 +01:00
committed by GitHub
parent e41ba7101f
commit cd1094c94e

View File

@@ -727,6 +727,51 @@ pub enum FormatterValue<'a> {
CodeString(&'a str),
}
fn write_flag_to_long_desc<F>(
flag: &nu_protocol::Flag,
long_desc: &mut String,
help_subcolor_one: &str,
help_subcolor_two: &str,
formatter: &mut F,
) where
F: FnMut(FormatterValue) -> String,
{
// Indentation
long_desc.push_str(" ");
// Short flag shown before long flag
if let Some(short) = flag.short {
let _ = write!(long_desc, "{help_subcolor_one}-{short}{RESET}");
if !flag.long.is_empty() {
let _ = write!(long_desc, "{DEFAULT_COLOR},{RESET} ");
}
}
if !flag.long.is_empty() {
let _ = write!(long_desc, "{help_subcolor_one}--{}{RESET}", flag.long);
}
if flag.required {
long_desc.push_str(" (required parameter)")
}
// Type/Syntax shape info
if let Some(arg) = &flag.arg {
let _ = write!(long_desc, " <{help_subcolor_two}{arg}{RESET}>");
}
if !flag.desc.is_empty() {
let _ = write!(
long_desc,
": {}",
&formatter(FormatterValue::CodeString(&flag.desc))
);
}
if let Some(value) = &flag.default_value {
let _ = write!(
long_desc,
" (default: {})",
&formatter(FormatterValue::DefaultValue(value))
);
}
long_desc.push('\n');
}
pub fn get_flags_section<F>(
signature: &Signature,
help_style: &HelpStyle,
@@ -741,42 +786,26 @@ where
let mut long_desc = String::new();
let _ = write!(long_desc, "\n{help_section_name}Flags{RESET}:\n");
for flag in &signature.named {
// Indentation
long_desc.push_str(" ");
// Short flag shown before long flag
if let Some(short) = flag.short {
let _ = write!(long_desc, "{help_subcolor_one}-{short}{RESET}");
if !flag.long.is_empty() {
let _ = write!(long_desc, "{DEFAULT_COLOR},{RESET} ");
}
}
if !flag.long.is_empty() {
let _ = write!(long_desc, "{help_subcolor_one}--{}{RESET}", flag.long);
}
if flag.required {
long_desc.push_str(" (required parameter)")
}
// Type/Syntax shape info
if let Some(arg) = &flag.arg {
let _ = write!(long_desc, " <{help_subcolor_two}{arg}{RESET}>");
}
if !flag.desc.is_empty() {
let _ = write!(
long_desc,
": {}",
&formatter(FormatterValue::CodeString(&flag.desc))
);
}
if let Some(value) = &flag.default_value {
let _ = write!(
long_desc,
" (default: {})",
&formatter(FormatterValue::DefaultValue(value))
);
}
long_desc.push('\n');
let help = signature.named.iter().find(|flag| flag.long == "help");
let required = signature.named.iter().filter(|flag| flag.required);
let optional = signature
.named
.iter()
.filter(|flag| !flag.required && flag.long != "help");
let flags = required.chain(help).chain(optional);
for flag in flags {
write_flag_to_long_desc(
flag,
&mut long_desc,
help_subcolor_one,
help_subcolor_two,
&mut formatter,
);
}
long_desc
}