From d3fc5f547c56ad63cf90a877238e5b2c9348083d Mon Sep 17 00:00:00 2001 From: Jonathan Anderson Date: Mon, 8 Feb 2016 16:13:08 -0330 Subject: [PATCH] Allow errors to propagate from getConfigFile(). When getConfigFile() fails to find a config file, creating a ConfigFileNotFoundError, propagate the error information rather than just setting filenames and config types to the empty string. This fixes the dreaded 'Unsupported Config Type ""' message that is seen when the user hasn't created a config file. --- viper.go | 34 +++++++++++++++++++++++++++------- viper_test.go | 6 ++++-- 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/viper.go b/viper.go index 00049ec..cdf6e9e 100644 --- a/viper.go +++ b/viper.go @@ -238,7 +238,13 @@ func (v *Viper) WatchConfig() { defer watcher.Close() // we have to watch the entire directory to pick up renames/atomic saves in a cross-platform way - configFile := filepath.Clean(v.getConfigFile()) + filename, err := v.getConfigFile() + if err != nil { + log.Println("error:", err) + return + } + + configFile := filepath.Clean(filename) configDir, _ := filepath.Split(configFile) done := make(chan bool) @@ -896,11 +902,16 @@ func (v *Viper) Set(key string, value interface{}) { func ReadInConfig() error { return v.ReadInConfig() } func (v *Viper) ReadInConfig() error { jww.INFO.Println("Attempting to read in config file") + filename, err := v.getConfigFile() + if err != nil { + return err + } + if !stringInSlice(v.getConfigType(), SupportedExts) { return UnsupportedConfigError(v.getConfigType()) } - file, err := ioutil.ReadFile(v.getConfigFile()) + file, err := ioutil.ReadFile(filename) if err != nil { return err } @@ -918,7 +929,12 @@ func (v *Viper) MergeInConfig() error { return UnsupportedConfigError(v.getConfigType()) } - file, err := ioutil.ReadFile(v.getConfigFile()) + filename, err := v.getConfigFile() + if err != nil { + return err + } + + file, err := ioutil.ReadFile(filename) if err != nil { return err } @@ -1191,7 +1207,11 @@ func (v *Viper) getConfigType() string { return v.configType } - cf := v.getConfigFile() + cf, err := v.getConfigFile() + if err != nil { + return "" + } + ext := filepath.Ext(cf) if len(ext) > 1 { @@ -1201,15 +1221,15 @@ func (v *Viper) getConfigType() string { } } -func (v *Viper) getConfigFile() string { +func (v *Viper) getConfigFile() (string, error) { // if explicitly set, then use it if v.configFile != "" { - return v.configFile + return v.configFile, nil } cf, err := v.findConfigFile() if err != nil { - return "" + return "", err } v.configFile = cf diff --git a/viper_test.go b/viper_test.go index fcb9c4e..328ea21 100644 --- a/viper_test.go +++ b/viper_test.go @@ -225,7 +225,9 @@ func (s *stringValue) String() string { func TestBasics(t *testing.T) { SetConfigFile("/tmp/config.yaml") - assert.Equal(t, "/tmp/config.yaml", v.getConfigFile()) + filename, err := v.getConfigFile() + assert.Equal(t, "/tmp/config.yaml", filename) + assert.NoError(t, err) } func TestDefault(t *testing.T) { @@ -718,7 +720,7 @@ func TestWrongDirsSearchNotFound(t *testing.T) { v.AddConfigPath(`thispathaintthere`) err := v.ReadInConfig() - assert.Equal(t, reflect.TypeOf(UnsupportedConfigError("")), reflect.TypeOf(err)) + assert.Equal(t, reflect.TypeOf(ConfigFileNotFoundError{"", ""}), reflect.TypeOf(err)) // Even though config did not load and the error might have // been ignored by the client, the default still loads