From 8e92590ac9e860201c8142e6a0a0346c5235bb7b Mon Sep 17 00:00:00 2001 From: Jaffa Planquart Date: Thu, 14 Nov 2024 15:48:37 +0100 Subject: [PATCH 1/3] docs(help): Fix hide_env_values doc --- clap_builder/src/builder/arg.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clap_builder/src/builder/arg.rs b/clap_builder/src/builder/arg.rs index e3d0d7d0ef7..5a8b1706922 100644 --- a/clap_builder/src/builder/arg.rs +++ b/clap_builder/src/builder/arg.rs @@ -2645,7 +2645,7 @@ impl Arg { /// ``` /// /// If we were to run the above program with `$ CONNECT=super_secret connect --help` the - /// `[default: CONNECT=super_secret]` portion of the help text would be omitted. + /// `[env: CONNECT=super_secret]` portion of the help text would be omitted. #[cfg(feature = "env")] #[inline] #[must_use] From c133bea7210088e78ff4e40829da9276ce42924e Mon Sep 17 00:00:00 2001 From: Jaffa Planquart Date: Thu, 14 Nov 2024 16:17:25 +0100 Subject: [PATCH 2/3] test(help): Display value terminator --- tests/builder/help.rs | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/tests/builder/help.rs b/tests/builder/help.rs index fb203b0e59e..ebb90477271 100644 --- a/tests/builder/help.rs +++ b/tests/builder/help.rs @@ -2064,6 +2064,34 @@ Options: utils::assert_output(cmd, "test --help", expected, false); } +#[test] +fn display_value_terminator() { + let cmd = Command::new("test") + .author("Jaffa") + .about("Likes seeing the value terminator") + .arg( + Arg::new("cmd") + .long("cmd") + .action(ArgAction::Append) + .help("command to run") + .required(true) + .num_args(1..) + .value_terminator(";"), + ); + + let expected = str![[r#" +Likes seeing the value terminator + +Usage: test --cmd ... + +Options: + --cmd ... command to run + -h, --help Print help + +"#]]; + utils::assert_output(cmd, "test --help", expected, false); +} + #[test] fn custom_headers_headers() { let cmd = Command::new("blorp") From c2dbb1beaba25295d79936874b8af1bd80aa09c0 Mon Sep 17 00:00:00 2001 From: Jaffa Planquart Date: Thu, 14 Nov 2024 16:24:17 +0100 Subject: [PATCH 3/3] fix(help): Display value terminator and delimiter Closes #5392 and #4812, related to #1052 --- clap_builder/src/builder/arg.rs | 8 +++++++- clap_builder/src/output/help_template.rs | 19 ++++++++++++++++++- tests/builder/help.rs | 18 +++++++++--------- 3 files changed, 34 insertions(+), 11 deletions(-) diff --git a/clap_builder/src/builder/arg.rs b/clap_builder/src/builder/arg.rs index 5a8b1706922..23c6a9bd0da 100644 --- a/clap_builder/src/builder/arg.rs +++ b/clap_builder/src/builder/arg.rs @@ -4647,6 +4647,7 @@ impl Arg { val_names = vec![val_name; min]; } + let delimiter = self.get_value_delimiter().unwrap_or(' '); debug_assert!(self.is_takes_value_set()); for (n, val_name) in val_names.iter().enumerate() { let arg_name = if self.is_positional() && (num_vals.min_values() == 0 || !required) { @@ -4656,7 +4657,7 @@ impl Arg { }; if n != 0 { - rendered.push(' '); + rendered.push(delimiter); } rendered.push_str(&arg_name); } @@ -4670,6 +4671,11 @@ impl Arg { rendered.push_str("..."); } + if let Some(terminator) = self.get_value_terminator() { + rendered.push(' '); + rendered.push_str(terminator); + } + rendered } diff --git a/clap_builder/src/output/help_template.rs b/clap_builder/src/output/help_template.rs index da08ccd3895..518081e05da 100644 --- a/clap_builder/src/output/help_template.rs +++ b/clap_builder/src/output/help_template.rs @@ -766,6 +766,13 @@ impl<'cmd, 'writer> HelpTemplate<'cmd, 'writer> { a.default_vals ); + // We might need up to 4 bytes to encode an utf-8 character + let mut buffer = [0u8; 4]; + let delimiter = a + .get_value_delimiter() + .unwrap_or(' ') + .encode_utf8(&mut buffer); + let pvs = a .default_vals .iter() @@ -778,11 +785,21 @@ impl<'cmd, 'writer> HelpTemplate<'cmd, 'writer> { } }) .collect::>() - .join(" "); + .join(delimiter); spec_vals.push(format!("[default: {pvs}]")); } + if let Some(delimiter) = a.get_value_delimiter() { + debug!("HelpTemplate::spec_vals: Found delimiter...{delimiter:?}"); + spec_vals.push(format!("[value delimiter: {delimiter:?}]")); + } + + if let Some(terminator) = a.get_value_terminator() { + debug!("HelpTemplate::spec_vals: Found terminator...{terminator:?}"); + spec_vals.push(format!("[value terminator: {terminator:?}]")); + } + let als = a .aliases .iter() diff --git a/tests/builder/help.rs b/tests/builder/help.rs index ebb90477271..3696a2f330e 100644 --- a/tests/builder/help.rs +++ b/tests/builder/help.rs @@ -2053,10 +2053,10 @@ fn issue_1052_require_delim_help() { let expected = str![[r#" tests stuff -Usage: test --fake +Usage: test --fake : Options: - -f, --fake some help + -f, --fake : some help [value delimiter: ':'] -h, --help Print help -V, --version Print version @@ -2082,11 +2082,11 @@ fn display_value_terminator() { let expected = str![[r#" Likes seeing the value terminator -Usage: test --cmd ... +Usage: test --cmd ... ; Options: - --cmd ... command to run - -h, --help Print help + --cmd ... ; command to run [value terminator: ";"] + -h, --help Print help "#]]; utils::assert_output(cmd, "test --help", expected, false); @@ -2118,10 +2118,10 @@ fn custom_headers_headers() { let expected = str![[r#" does stuff -Usage: test [OPTIONS] --fake +Usage: test [OPTIONS] --fake : Options: - -f, --fake some help + -f, --fake : some help [value delimiter: ':'] -h, --help Print help -V, --version Print version @@ -2189,10 +2189,10 @@ fn multiple_custom_help_headers() { let expected = str![[r#" does stuff -Usage: test [OPTIONS] --fake --birthday-song --birthday-song-volume +Usage: test [OPTIONS] --fake : --birthday-song --birthday-song-volume Options: - -f, --fake some help + -f, --fake : some help [value delimiter: ':'] --style