Validate duplicate short flags.

Fixes #174.
This commit is contained in:
Alec Thomas
2021-06-09 13:01:16 +10:00
parent 6cebaa7b85
commit ff93d67a8d
2 changed files with 34 additions and 3 deletions
+14 -3
View File
@@ -119,7 +119,10 @@ func buildNode(k *Kong, v reflect.Value, typ NodeType, seenFlags map[string]bool
// "Unsee" flags.
for _, flag := range node.Flags {
delete(seenFlags, flag.Name)
delete(seenFlags, "--"+flag.Name)
if flag.Short != 0 {
delete(seenFlags, "-"+string(flag.Short))
}
}
// Scan through argument positionals to ensure optional is never before a required.
@@ -205,10 +208,18 @@ func buildField(k *Kong, node *Node, v reflect.Value, ft reflect.StructField, fv
if tag.Arg {
node.Positional = append(node.Positional, value)
} else {
if seenFlags[value.Name] {
if seenFlags["--"+value.Name] {
fail("duplicate flag --%s", value.Name)
} else {
seenFlags["--"+value.Name] = true
}
if tag.Short != 0 {
if seenFlags["-"+string(tag.Short)] {
fail("duplicate short flag -%c", tag.Short)
} else {
seenFlags["-"+string(tag.Short)] = true
}
}
seenFlags[value.Name] = true
flag := &Flag{
Value: value,
Short: tag.Short,
+20
View File
@@ -1062,3 +1062,23 @@ func TestDynamicCommands(t *testing.T) {
require.NoError(t, err)
require.True(t, two.ran)
}
func TestDuplicateShortflags(t *testing.T) {
cli := struct {
Flag1 bool `short:"t"`
Flag2 bool `short:"t"`
}{}
_, err := kong.New(&cli)
require.EqualError(t, err, "duplicate short flag -t")
}
func TestDuplicateNestedShortFlags(t *testing.T) {
cli := struct {
Flag1 bool `short:"t"`
Cmd struct {
Flag2 bool `short:"t"`
} `cmd:""`
}{}
_, err := kong.New(&cli)
require.EqualError(t, err, "duplicate short flag -t")
}