Add help output for wayvncctl positional arguments
Signed-off-by: Jim Ramsay <i.am@jimramsay.com>wayvncctl-polishing
parent
23527a095a
commit
405e9a13df
|
@ -50,6 +50,8 @@ struct option_parser {
|
||||||
void option_parser_init(struct option_parser* self,
|
void option_parser_init(struct option_parser* self,
|
||||||
const struct wv_option* options);
|
const struct wv_option* options);
|
||||||
|
|
||||||
|
int option_parser_print_arguments(struct option_parser* self, FILE* stream);
|
||||||
|
|
||||||
void option_parser_print_options(struct option_parser* self, FILE* stream);
|
void option_parser_print_options(struct option_parser* self, FILE* stream);
|
||||||
|
|
||||||
int option_parser_parse(struct option_parser* self, int argc,
|
int option_parser_parse(struct option_parser* self, int argc,
|
||||||
|
|
|
@ -737,9 +737,12 @@ static int print_command_usage(struct ctl_client* self,
|
||||||
for (int i = 0; i < cmd_options->n_opts; ++i)
|
for (int i = 0; i < cmd_options->n_opts; ++i)
|
||||||
if (cmd_options->options[i].positional)
|
if (cmd_options->options[i].positional)
|
||||||
printf("<%s> ", cmd_options->options[i].positional);
|
printf("<%s> ", cmd_options->options[i].positional);
|
||||||
|
|
||||||
printf("[parameters]\n\n");
|
printf("[parameters]\n\n");
|
||||||
table_printer_indent_and_reflow_text(stdout, info->description, 80, 0, 0);
|
table_printer_indent_and_reflow_text(stdout, info->description, 80, 0, 0);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
if (option_parser_print_arguments(cmd_options, stdout))
|
||||||
|
printf("\n");
|
||||||
option_parser_print_options(cmd_options, stdout);
|
option_parser_print_options(cmd_options, stdout);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
option_parser_print_options(parent_options, stdout);
|
option_parser_print_options(parent_options, stdout);
|
||||||
|
@ -772,6 +775,7 @@ int ctl_client_init_cmd_parser(struct option_parser* parser, enum cmd_type cmd)
|
||||||
if (param_count == 1) {
|
if (param_count == 1) {
|
||||||
// Represent a single parameter as a positional argument
|
// Represent a single parameter as a positional argument
|
||||||
options[0].positional = info->params[0].name;
|
options[0].positional = info->params[0].name;
|
||||||
|
options[0].help = info->params[0].description;
|
||||||
i++;
|
i++;
|
||||||
} else {
|
} else {
|
||||||
for (; i < param_count; ++i) {
|
for (; i < param_count; ++i) {
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
#include <sys/param.h>
|
||||||
|
|
||||||
#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
|
#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
|
||||||
|
|
||||||
|
@ -75,7 +76,7 @@ static int get_left_col_width(const struct wv_option* opts, int n)
|
||||||
|
|
||||||
static void format_option(struct table_printer* printer, const struct wv_option* opt)
|
static void format_option(struct table_printer* printer, const struct wv_option* opt)
|
||||||
{
|
{
|
||||||
if (!opt->help)
|
if (!opt->help || opt->positional)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
int n_chars = 0;
|
int n_chars = 0;
|
||||||
|
@ -104,6 +105,31 @@ void option_parser_print_options(struct option_parser* self, FILE* stream)
|
||||||
format_option(&printer, &self->options[i]);
|
format_option(&printer, &self->options[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int option_parser_print_arguments(struct option_parser* self, FILE* stream)
|
||||||
|
{
|
||||||
|
size_t max_arg = 0;
|
||||||
|
for (int i = 0; i < self->n_opts; ++i) {
|
||||||
|
const struct wv_option* opt = &self->options[i];
|
||||||
|
if (!opt->positional || !opt->help || opt->is_subcommand)
|
||||||
|
continue;
|
||||||
|
max_arg = MAX(max_arg, strlen(opt->positional));
|
||||||
|
}
|
||||||
|
if (!max_arg)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
fprintf(stream, "Arguments:\n");
|
||||||
|
struct table_printer printer;
|
||||||
|
table_printer_init(&printer, stream, max_arg);
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < self->n_opts; ++i) {
|
||||||
|
const struct wv_option* opt = &self->options[i];
|
||||||
|
if (!opt->positional || !opt->help || opt->is_subcommand)
|
||||||
|
continue;
|
||||||
|
table_printer_print_line(&printer, opt->positional, opt->help);
|
||||||
|
}
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
static const struct wv_option* find_long_option(
|
static const struct wv_option* find_long_option(
|
||||||
const struct option_parser* self, const char* name)
|
const struct option_parser* self, const char* name)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue