From 2ef7a4a18b4122adbe30b8941e28d2b3871f968d Mon Sep 17 00:00:00 2001 From: Kiril Zvezdarov Date: Wed, 1 Apr 2015 21:38:54 -0400 Subject: [PATCH 1/3] Added BindPFlags function which binds all flags in a given flag set to the pflags register --- viper.go | 15 +++++++++++++++ viper_test.go | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/viper.go b/viper.go index be41206..f1b7eec 100644 --- a/viper.go +++ b/viper.go @@ -361,6 +361,21 @@ func (v *Viper) Marshal(rawVal interface{}) error { return nil } +// Bind a full flag set to the configuration, using each flag's long +// name as the config key. +func BindPFlags(flags *pflag.FlagSet) (err error) { return v.BindPFlags(flags) } +func (v *Viper) BindPFlags(flags *pflag.FlagSet) (err error) { + flags.VisitAll(func(flag *pflag.Flag) { + if err != nil { + // an error has been encountered in one of the previous flags + return + } + + err = v.BindPFlag(flag.Name, flag) + }) + return +} + // Bind a specific key to a flag (as used by cobra) // // serverCmd.Flags().Int("port", 1138, "Port to run Application server on") diff --git a/viper_test.go b/viper_test.go index 78b107b..4d049b6 100644 --- a/viper_test.go +++ b/viper_test.go @@ -333,6 +333,41 @@ func TestMarshal(t *testing.T) { assert.Equal(t, &C, &config{Name: "Steve", Port: 1234}) } +func TestBindPFlags(t *testing.T) { + flagSet := pflag.NewFlagSet("test", pflag.ContinueOnError) + + var testValues = map[string]*string{ + "host": nil, + "port": nil, + "endpoint": nil, + } + + var mutatedTestValues = map[string]string{ + "host": "localhost", + "port": "6060", + "endpoint": "/public", + } + + for name, _ := range testValues { + testValues[name] = flagSet.String(name, "", "test") + } + + err := BindPFlags(flagSet) + if err != nil { + t.Fatalf("error binding flag set, %v", err) + } + + flagSet.VisitAll(func(flag *pflag.Flag) { + flag.Value.Set(mutatedTestValues[flag.Name]) + flag.Changed = true + }) + + for name, expected := range mutatedTestValues { + assert.Equal(t, Get(name), expected) + } + +} + func TestBindPFlag(t *testing.T) { var testString = "testing" var testValue = newStringValue(testString, &testString) From 590bfb59e556740b99e43be3f1c624414c876bd4 Mon Sep 17 00:00:00 2001 From: Kiril Zvezdarov Date: Wed, 1 Apr 2015 21:39:09 -0400 Subject: [PATCH 2/3] Added the pflags register to the debug output --- viper.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/viper.go b/viper.go index f1b7eec..094c1b6 100644 --- a/viper.go +++ b/viper.go @@ -810,4 +810,6 @@ func (v *Viper) Debug() { pretty.Println(v.override) fmt.Println("Aliases:") pretty.Println(v.aliases) + fmt.Println("PFlags") + pretty.Println(v.pflags) } From bf641426ac2b9e24f2e2deb9451c21c1746810dd Mon Sep 17 00:00:00 2001 From: Kiril Zvezdarov Date: Wed, 1 Apr 2015 21:42:06 -0400 Subject: [PATCH 3/3] Set default values when binding the whole flagset --- viper.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/viper.go b/viper.go index 094c1b6..90900be 100644 --- a/viper.go +++ b/viper.go @@ -372,6 +372,14 @@ func (v *Viper) BindPFlags(flags *pflag.FlagSet) (err error) { } err = v.BindPFlag(flag.Name, flag) + switch flag.Value.Type() { + case "int", "int8", "int16", "int32", "int64": + v.SetDefault(flag.Name, cast.ToInt(flag.Value.String())) + case "bool": + v.SetDefault(flag.Name, cast.ToBool(flag.Value.String())) + default: + v.SetDefault(flag.Name, flag.Value.String()) + } }) return }