Skip to content

Commit

Permalink
fix: Add possible vals to man for positional args
Browse files Browse the repository at this point in the history
Noticed that possible values would not show up for Positional arguments
as well. Decided to add the changes for those as well.
  • Loading branch information
Calder-Ty committed Aug 30, 2022
1 parent 9b4c276 commit 636b91c
Show file tree
Hide file tree
Showing 7 changed files with 106 additions and 43 deletions.
95 changes: 64 additions & 31 deletions clap_mangen/src/render.rs
@@ -1,4 +1,4 @@
use clap::AppSettings;
use clap::{AppSettings};
use std::vec;

use roff::{bold, italic, roman, Inline, Roff};
Expand Down Expand Up @@ -110,53 +110,39 @@ pub(crate) fn options(roff: &mut Roff, cmd: &clap::Command) {
}

let mut body = vec![];
let mut help_written = false;
let mut arg_help_written = false;
if let Some(help) = opt.get_long_help().or_else(|| opt.get_help()) {
help_written = true;
arg_help_written = true;
body.push(roman(help));
}

roff.control("TP", []);
roff.text(header);
roff.text(body);

let possibles: Vec<clap::builder::PossibleValue> = opt
.get_value_parser()
.possible_values()
.map(|pvs| pvs.collect())
.unwrap_or_default();
let possibles: Vec<&clap::builder::PossibleValue> =
possibles.iter().filter(|pos| !pos.is_hide_set()).collect();

if !(possibles.is_empty() || opt.is_hide_possible_values_set()) {
if help_written {
if let Some((possible_values_text, with_help)) = get_possible_values(opt) {
if arg_help_written {
// It looks nice to have a separation between the help and the values
roff.text([Inline::LineBreak]);
}
// with help for each possible value

if possibles.iter().any(|p| p.get_help().is_some()) {
if with_help {
roff.text([Inline::LineBreak, italic("Possible values:")]);

// Need to indent twice to get it to look right,
// because .TP heading indents, but that indent doesn't
// Carry over to the .IP for the bullets.
// The standard shift size is 7 for terminal devices
// Need to indent twice to get it to look right, because .TP heading indents, but
// that indent doesn't Carry over to the .IP for the bullets. The standard shift
// size is 7 for terminal devices
roff.control("RS", ["14"]);
for line in format_possible_values(&possibles) {
for line in possible_values_text {
roff.control("IP", ["\\(bu", "2"]);
roff.text([roman(line)]);
}
roff.control("RE", []);
}

// without help for each possible value
else {
let possible_list = format_possible_values(&possibles);
} else {
let possible_value_text: Vec<Inline> = vec![
Inline::LineBreak,
italic("[possible values: "),
roman(possible_list.join(", ")),
roman("["),
italic("possible values: "),
roman(possible_values_text.join(", ")),
roman("]"),
];
roff.text(possible_value_text);
Expand Down Expand Up @@ -186,8 +172,10 @@ pub(crate) fn options(roff: &mut Roff, cmd: &clap::Command) {
}

let mut body = vec![];
let mut arg_help_written = false;
if let Some(help) = pos.get_long_help().or_else(|| pos.get_help()) {
body.push(roman(&help.to_string()));
arg_help_written = true;
}

roff.control("TP", []);
Expand All @@ -199,6 +187,35 @@ pub(crate) fn options(roff: &mut Roff, cmd: &clap::Command) {
roff.text(env);
roff.control("RE", []);
}
// If possible options are available
if let Some((possible_values_text, with_help)) = get_possible_values(pos) {
if arg_help_written {
// It looks nice to have a separation between the help and the values
roff.text([Inline::LineBreak]);
}
if with_help {
roff.text([Inline::LineBreak, italic("Possible values:")]);

// Need to indent twice to get it to look right, because .TP heading indents, but
// that indent doesn't Carry over to the .IP for the bullets. The standard shift
// size is 7 for terminal devices
roff.control("RS", ["14"]);
for line in possible_values_text {
roff.control("IP", ["\\(bu", "2"]);
roff.text([roman(line)]);
}
roff.control("RE", []);
} else {
let possible_value_text: Vec<Inline> = vec![
Inline::LineBreak,
roman("["),
italic("possible values: "),
roman(possible_values_text.join(", ")),
roman("]"),
];
roff.text(possible_value_text);
}
}
}
}

Expand Down Expand Up @@ -288,9 +305,25 @@ fn option_default_values(opt: &clap::Arg) -> Option<String> {
None
}

fn format_possible_values(possibles: &Vec<&clap::builder::PossibleValue>) -> Vec<String> {
fn get_possible_values(arg: &clap::Arg) -> Option<(Vec<String>, bool)> {
let possibles = arg.get_value_parser().possible_values();

if let Some(possible_vals) = possibles {
let possibles: Vec<_> = possible_vals.collect();
let shown_possibles: Vec<_> = possibles.iter().filter(|pos| !pos.is_hide_set()).collect();

if !(shown_possibles.is_empty() || arg.is_hide_possible_values_set()) {
return Some(format_possible_values(&shown_possibles));
}
return None;
}
None
}

fn format_possible_values(possibles: &Vec<&clap::builder::PossibleValue>) -> (Vec<String>, bool) {
let mut lines = vec![];
if possibles.iter().any(|p| p.get_help().is_some()) {
let with_help = possibles.iter().any(|p| p.get_help().is_some());
if with_help {
for value in possibles {
let val_name = value.get_name();
match value.get_help() {
Expand All @@ -301,5 +334,5 @@ fn format_possible_values(possibles: &Vec<&clap::builder::PossibleValue>) -> Vec
} else {
lines.append(&mut possibles.iter().map(|p| p.get_name().to_string()).collect());
}
lines
(lines, with_help)
}
29 changes: 20 additions & 9 deletions clap_mangen/tests/common.rs
@@ -1,7 +1,6 @@
use clap::builder::PossibleValue;

pub fn basic_command(name: &'static str) -> clap::Command<'static> {

clap::Command::new(name)
.arg(clap::Arg::new("config").short('c').global(true))
.arg(clap::Arg::new("v").short('v').conflicts_with("config"))
Expand Down Expand Up @@ -256,7 +255,7 @@ pub fn assert_matches_path(expected_path: impl AsRef<std::path::Path>, cmd: clap
.matches_path(expected_path, buf);
}

pub fn possible_values_command(name: &'static str) -> clap::Command<'static> {
pub fn possible_values_command(name: &'static str) -> clap::Command {
clap::Command::new(name)
.trailing_var_arg(true)
.arg(
Expand All @@ -267,12 +266,24 @@ pub fn possible_values_command(name: &'static str) -> clap::Command<'static> {
)
.arg(
clap::Arg::new("method")
.long("method")
.action(clap::ArgAction::Set)
.value_parser([
PossibleValue::new("fast").help("use the Fast method"),
PossibleValue::new("slow").help("use the slow method"),
PossibleValue::new("normal").help("use normal mode").hide(true)
])
.long("method")
.action(clap::ArgAction::Set)
.value_parser([
PossibleValue::new("fast").help("use the Fast method"),
PossibleValue::new("slow").help("use the slow method"),
PossibleValue::new("normal")
.help("use normal mode")
.hide(true),
]),
)
.arg(
clap::Arg::new("positional_choice")
.action(clap::ArgAction::Set)
.help("Pick the Position you want the command to run in")
.value_parser([
PossibleValue::new("left").help("run left adjusted"),
PossibleValue::new("right"),
PossibleValue::new("center").hide(true),
]),
)
}
2 changes: 2 additions & 0 deletions clap_mangen/tests/snapshots/feature_sample.bash.roff
Expand Up @@ -23,6 +23,8 @@ some input file
.TP
[/fIchoice/fR]

.br
[/fIpossible values: /fRfirst, second]
.SH SUBCOMMANDS
.TP
my/-app/-test(1)
Expand Down
17 changes: 15 additions & 2 deletions clap_mangen/tests/snapshots/possible_values.bash.roff
Expand Up @@ -4,7 +4,7 @@
.SH NAME
my/-app
.SH SYNOPSIS
/fBmy/-app/fR [/fB/-h/fR|/fB/-/-help/fR] [/fB/-/-choice/fR] [/fB/-/-method/fR]
/fBmy/-app/fR [/fB/-h/fR|/fB/-/-help/fR] [/fB/-/-choice/fR] [/fB/-/-method/fR] [/fIpositional_choice/fR]
.SH DESCRIPTION
.SH OPTIONS
.TP
Expand All @@ -14,7 +14,7 @@ Print help information
/fB/-/-choice/fR

.br
/fI[possible values: /fRbash, fish, zsh]
[/fIpossible values: /fRbash, fish, zsh]
.TP
/fB/-/-method/fR

Expand All @@ -26,3 +26,16 @@ fast: use the Fast method
.IP /(bu 2
slow: use the slow method
.RE
.TP
[/fIpositional_choice/fR]
Pick the Position you want the command to run in
.br

.br
/fIPossible values:/fR
.RS 14
.IP /(bu 2
left: run left adjusted
.IP /(bu 2
right
.RE
2 changes: 2 additions & 0 deletions clap_mangen/tests/snapshots/special_commands.bash.roff
Expand Up @@ -23,6 +23,8 @@ some input file
.TP
[/fIchoice/fR]

.br
[/fIpossible values: /fRfirst, second]
.SH SUBCOMMANDS
.TP
my/-app/-test(1)
Expand Down
2 changes: 2 additions & 0 deletions clap_mangen/tests/snapshots/sub_subcommands.bash.roff
Expand Up @@ -23,6 +23,8 @@ some input file
.TP
[/fIchoice/fR]

.br
[/fIpossible values: /fRfirst, second]
.SH SUBCOMMANDS
.TP
my/-app/-test(1)
Expand Down
2 changes: 1 addition & 1 deletion clap_mangen/tests/snapshots/value_hint.bash.roff
Expand Up @@ -14,7 +14,7 @@ Print help information
/fB/-/-choice/fR

.br
/fI[possible values: /fRbash, fish, zsh]
[/fIpossible values: /fRbash, fish, zsh]
.TP
/fB/-/-unknown/fR

Expand Down

0 comments on commit 636b91c

Please sign in to comment.