aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Paris <[email protected]>2015-08-16 22:42:52 -0700
committerEric Paris <[email protected]>2015-08-16 22:42:52 -0700
commit11251d78bb57ed618b8d4a1ee039affca6d64fb9 (patch)
tree6b7b45fb16d399e64949d036e5bfdc6be79586f6
parent4b69d21313e8b16259f8fdac37156283b254c84b (diff)
parente0e7ef766bf91748c5c55258e3773edaea7ed5f4 (diff)
Merge pull request #48 from eparis/addFlagSet
New AddFlagSet function on FlagSet
-rw-r--r--flag.go13
-rw-r--r--flag_test.go17
2 files changed, 30 insertions, 0 deletions
diff --git a/flag.go b/flag.go
index c99ccf3..603c81a 100644
--- a/flag.go
+++ b/flag.go
@@ -524,6 +524,19 @@ func (f *FlagSet) AddFlag(flag *Flag) {
f.shorthands[c] = flag
}
+// AddFlagSet adds one FlagSet to another. If a flag is already present in f
+// the flag from newSet will be ignored
+func (f *FlagSet) AddFlagSet(newSet *FlagSet) {
+ if newSet == nil {
+ return
+ }
+ newSet.VisitAll(func(flag *Flag) {
+ if f.Lookup(flag.Name) == nil {
+ f.AddFlag(flag)
+ }
+ })
+}
+
// Var defines a flag with the specified name and usage string. The type and
// value of the flag are represented by the first argument, of type Value, which
// typically holds a user-defined implementation of Value. For instance, the
diff --git a/flag_test.go b/flag_test.go
index 9ff1934..5114f28 100644
--- a/flag_test.go
+++ b/flag_test.go
@@ -110,6 +110,23 @@ func TestUsage(t *testing.T) {
}
}
+func TestAddFlagSet(t *testing.T) {
+ oldSet := NewFlagSet("old", ContinueOnError)
+ newSet := NewFlagSet("new", ContinueOnError)
+
+ oldSet.String("flag1", "flag1", "flag1")
+ oldSet.String("flag2", "flag2", "flag2")
+
+ newSet.String("flag2", "flag2", "flag2")
+ newSet.String("flag3", "flag3", "flag3")
+
+ oldSet.AddFlagSet(newSet)
+
+ if len(oldSet.formal) != 3 {
+ t.Errorf("Unexpected result adding a FlagSet to a FlagSet %v", oldSet)
+ }
+}
+
func TestAnnotation(t *testing.T) {
f := NewFlagSet("shorthand", ContinueOnError)