diff --git a/context.go b/context.go index 8065efd..ea91e5c 100644 --- a/context.go +++ b/context.go @@ -743,14 +743,23 @@ func (c *Context) PrintUsage(summary bool) error { } func checkMissingFlags(flags []*Flag) error { + xorGroupSet := map[string]bool{} xorGroup := map[string][]string{} missing := []string{} for _, flag := range flags { + if flag.Set { + for _, xor := range flag.Xor { + xorGroupSet[xor] = true + } + } if !flag.Required || flag.Set { continue } if len(flag.Xor) > 0 { for _, xor := range flag.Xor { + if xorGroupSet[xor] { + continue + } xorGroup[xor] = append(xorGroup[xor], flag.Summary()) } } else { diff --git a/kong_test.go b/kong_test.go index 37f7529..8418355 100644 --- a/kong_test.go +++ b/kong_test.go @@ -904,6 +904,21 @@ func TestXorRequired(t *testing.T) { require.EqualError(t, err, "missing flags: --four, --one or --three, --one or --two") } +func TestXorRequiredMany(t *testing.T) { + var cli struct { + One bool `xor:"one" required:""` + Two bool `xor:"one" required:""` + Three bool `xor:"one" required:""` + } + p := mustNew(t, &cli) + _, err := p.Parse([]string{"--one"}) + require.NoError(t, err) + + p = mustNew(t, &cli) + _, err = p.Parse([]string{}) + require.EqualError(t, err, "missing flags: --one or --two or --three") +} + func TestEnumSequence(t *testing.T) { var cli struct { State []string `enum:"a,b,c" default:"a"`