mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 05:35:25 +00:00
vsh: Allow one optional positional argument
We already allow a optional positional _ARGV argument but there's no reason why any other argument type could not be allowed this way. Add checks that there's just one such argument and it's placed after required positional arguments. Signed-off-by: Peter Krempa <pkrempa@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
parent
627cf466f0
commit
fc7934695d
20
tools/vsh.c
20
tools/vsh.c
@ -249,6 +249,7 @@ vshCmddefCheckInternals(vshControl *ctl,
|
|||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
bool seenOptionalOption = false;
|
bool seenOptionalOption = false;
|
||||||
|
const char *seenOptionalPositionalOption = NULL;
|
||||||
g_auto(virBuffer) complbuf = VIR_BUFFER_INITIALIZER;
|
g_auto(virBuffer) complbuf = VIR_BUFFER_INITIALIZER;
|
||||||
g_auto(virBuffer) posbuf = VIR_BUFFER_INITIALIZER;
|
g_auto(virBuffer) posbuf = VIR_BUFFER_INITIALIZER;
|
||||||
|
|
||||||
@ -350,10 +351,21 @@ vshCmddefCheckInternals(vshControl *ctl,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* require that positional non-argv options are required */
|
/* allow at most one optional positional option */
|
||||||
if (opt->positional && !opt->required && opt->type != VSH_OT_ARGV) {
|
if (opt->positional && !opt->required) {
|
||||||
vshError(ctl, "positional argument '%s' of command '%s' must be required",
|
if (seenOptionalPositionalOption) {
|
||||||
opt->name, cmd->name);
|
vshError(ctl, "multiple optional positional arguments (%s, %s) of command '%s' are not allowed",
|
||||||
|
seenOptionalPositionalOption, opt->name, cmd->name);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
seenOptionalPositionalOption = opt->name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* all optional positional arguments must be defined after the required ones */
|
||||||
|
if (seenOptionalPositionalOption && opt->positional && opt->required) {
|
||||||
|
vshError(ctl, "required positional argument '%s' declared after an optional positional argument '%s' of command '%s'",
|
||||||
|
opt->name, seenOptionalPositionalOption, cmd->name);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user