From af373af72c16a023e39cee8a68f9fa9c7f9c2512 Mon Sep 17 00:00:00 2001 From: spf13 Date: Thu, 26 Jun 2014 17:58:55 -0400 Subject: [PATCH] Adding the ability to get into a struct --- viper.go | 23 +++++++++++++++++++++++ viper_test.go | 26 ++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/viper.go b/viper.go index e88dec9..a56472f 100644 --- a/viper.go +++ b/viper.go @@ -20,6 +20,7 @@ import ( "github.com/BurntSushi/toml" "github.com/kr/pretty" + "github.com/mitchellh/mapstructure" "github.com/spf13/cast" jww "github.com/spf13/jwalterweatherman" "gopkg.in/yaml.v1" @@ -93,6 +94,28 @@ func GetStringMapString(key string) map[string]string { return cast.ToStringMapString(Get(key)) } +// takes a map and uses reflection to convert it into the given Go native structure. +// rawVal must be a pointer to a struct. +func GetIntoStruct(key string, rawVal interface{}) error { + return mapstructure.Decode(Get(key), rawVal) +} + +func GetAllIntoStruct(rawVal interface{}) (err error) { + err = mapstructure.Decode(defaults, rawVal) + if err != nil { + return + } + err = mapstructure.Decode(config, rawVal) + if err != nil { + return + } + err = mapstructure.Decode(override, rawVal) + if err != nil { + return + } + return +} + func find(key string) interface{} { var val interface{} var exists bool diff --git a/viper_test.go b/viper_test.go index f418cbd..c8ab4f9 100644 --- a/viper_test.go +++ b/viper_test.go @@ -128,3 +128,29 @@ func TestRecursiveAliases(t *testing.T) { RegisterAlias("Baz", "Roo") RegisterAlias("Roo", "baz") } + +func TestIntoStruct(t *testing.T) { + SetDefault("port", 1313) + Set("name", "Steve") + + type config struct { + Port int + Name string + } + + var C config + + err := GetAllIntoStruct(&C) + if err != nil { + t.Fatalf("unable to decode into struct, %v", err) + } + + assert.Equal(t, &C, &config{Name: "Steve", Port: 1313}) + + Set("port", 1234) + err = GetAllIntoStruct(&C) + if err != nil { + t.Fatalf("unable to decode into struct, %v", err) + } + assert.Equal(t, &C, &config{Name: "Steve", Port: 1234}) +}