57 lines
1.1 KiB
Go
57 lines
1.1 KiB
Go
package cli
|
|
|
|
// MutuallyExclusiveFlags defines a mutually exclusive flag group
|
|
// Multiple option paths can be provided out of which
|
|
// only one can be defined on cmdline
|
|
// So for example
|
|
// [ --foo | [ --bar something --darth somethingelse ] ]
|
|
type MutuallyExclusiveFlags struct {
|
|
// Flag list
|
|
Flags [][]Flag
|
|
|
|
// whether this group is required
|
|
Required bool
|
|
|
|
// Category to apply to all flags within group
|
|
Category string
|
|
}
|
|
|
|
func (grp MutuallyExclusiveFlags) check(cmd *Command) error {
|
|
oneSet := false
|
|
e := &mutuallyExclusiveGroup{}
|
|
|
|
for _, grpf := range grp.Flags {
|
|
for _, f := range grpf {
|
|
for _, name := range f.Names() {
|
|
if cmd.IsSet(name) {
|
|
if oneSet {
|
|
e.flag2Name = name
|
|
return e
|
|
}
|
|
e.flag1Name = name
|
|
oneSet = true
|
|
break
|
|
}
|
|
}
|
|
if oneSet {
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
if !oneSet && grp.Required {
|
|
return &mutuallyExclusiveGroupRequiredFlag{flags: &grp}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (grp MutuallyExclusiveFlags) propagateCategory() {
|
|
for _, grpf := range grp.Flags {
|
|
for _, f := range grpf {
|
|
if cf, ok := f.(CategorizableFlag); ok {
|
|
cf.SetCategory(grp.Category)
|
|
}
|
|
}
|
|
}
|
|
}
|