Perinci-CmdLine-Help
view release on metacpan or search on metacpan
lib/Perinci/CmdLine/Help.pm view on Meta::CPAN
my @help;
# summary
my $progname = $args{program_name};
{
my $sum = $args{program_summary} // $meta->{summary};
last unless $sum;
push @help, $progname, " - ", $sum, "\n\n";
}
my $clidocdata;
# usage
push @help, "Usage:\n";
{
for (sort {
($common_opts->{$a}{order} // 99) <=>
($common_opts->{$b}{order} // 99) ||
$a cmp $b
} keys %$common_opts) {
my $co = $common_opts->{$_};
lib/Perinci/CmdLine/Help.pm view on Meta::CPAN
meta => $meta, meta_is_normalized => 1,
common_opts => $common_opts,
per_arg_json => $args{per_arg_json},
per_arg_yaml => $args{per_arg_yaml},
(ggls_res => $args{ggls_res}) x defined($args{ggls_res}),
(lang => $args{lang}) x defined($args{lang}),
(mark_different_lang => $args{mark_different_lang}) x defined($args{mark_different_lang}),
);
die [500, "gen_cli_doc_data_from_meta failed: ".
"$res->[0] - $res->[1]"] unless $res->[0] == 200;
$clidocdata = $res->[2];
my $usage = $clidocdata->{usage_line};
$usage =~ s/\[\[prog\]\]/$progname/;
local $Text::Wrap::break = '(?=\s)\X|(?<=\\|)';
push @help, Text::Wrap::wrap(" ", " ", "$usage\n");
}
# subcommands
{
my $subcommands = $args{subcommands} or last;
push @help, "\nSubcommands:\n";
if (keys(%$subcommands) >= 12) {
lib/Perinci/CmdLine/Help.pm view on Meta::CPAN
my $sc_spec = $subcommands->{$sc_name};
next unless $sc_spec->{show_in_help} //1;
push @help, " $sc_name\n";
}
}
}
# example
{
# XXX categorize too, like options
last unless @{ $clidocdata->{examples} };
push @help, "\nExamples:\n";
my $i = 0;
my $egs = $clidocdata->{examples};
for my $eg (@$egs) {
$i++;
my $cmdline = $eg->{cmdline};
$cmdline =~ s/\[\[prog\]\]/$progname/;
push @help, "\n" if $eg->{summary} && $i > 1;
if ($eg->{summary}) {
push @help, " $eg->{summary}:\n";
} else {
push @help, "\n";
}
lib/Perinci/CmdLine/Help.pm view on Meta::CPAN
last unless $desc;
$desc =~ s/\A\n+//;
$desc =~ s/\n+\z//;
push @help, "\n", $desc, "\n" if $desc =~ /\S/;
}
# options
{
require Data::Dmp;
my $opts = $clidocdata->{opts};
last unless keys %$opts;
# find all the categories
my %options_by_cat; # val=[options...]
for my $optkey (keys %$opts) {
for my $cat (@{ $opts->{$optkey}{categories} }) {
push @{ $options_by_cat{$cat} }, $optkey;
}
}
my $cats_spec = $clidocdata->{option_categories};
for my $cat (sort {
($cats_spec->{$a}{order} // 50) <=> ($cats_spec->{$b}{order} // 50)
|| $a cmp $b }
keys %options_by_cat) {
# find the longest option
my @opts = sort {length($b)<=>length($a)}
@{ $options_by_cat{$cat} };
my $len = length($opts[0]);
# sort again by name
@opts = sort {
( run in 0.509 second using v1.01-cache-2.11-cpan-454fe037f31 )