Allow errors to propagate from getConfigFile(). (#161)

- propagate ConfigFileNotFoundError instead of using unsupported config type error when config file is not found
This commit is contained in:
Jonathan Anderson 2016-10-13 09:03:30 -02:30 committed by Max Wolter
parent c14ce6d43c
commit 44208030b3
2 changed files with 36 additions and 10 deletions

View file

@ -241,7 +241,13 @@ func (v *Viper) WatchConfig() {
defer watcher.Close() defer watcher.Close()
// we have to watch the entire directory to pick up renames/atomic saves in a cross-platform way // 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) configDir, _ := filepath.Split(configFile)
done := make(chan bool) done := make(chan bool)
@ -1102,11 +1108,16 @@ func (v *Viper) Set(key string, value interface{}) {
func ReadInConfig() error { return v.ReadInConfig() } func ReadInConfig() error { return v.ReadInConfig() }
func (v *Viper) ReadInConfig() error { func (v *Viper) ReadInConfig() error {
jww.INFO.Println("Attempting to read in config file") jww.INFO.Println("Attempting to read in config file")
filename, err := v.getConfigFile()
if err != nil {
return err
}
if !stringInSlice(v.getConfigType(), SupportedExts) { if !stringInSlice(v.getConfigType(), SupportedExts) {
return UnsupportedConfigError(v.getConfigType()) return UnsupportedConfigError(v.getConfigType())
} }
file, err := afero.ReadFile(v.fs, v.getConfigFile()) file, err := afero.ReadFile(v.fs, filename)
if err != nil { if err != nil {
return err return err
} }
@ -1124,7 +1135,12 @@ func (v *Viper) MergeInConfig() error {
return UnsupportedConfigError(v.getConfigType()) return UnsupportedConfigError(v.getConfigType())
} }
file, err := afero.ReadFile(v.fs, v.getConfigFile()) filename, err := v.getConfigFile()
if err != nil {
return err
}
file, err := afero.ReadFile(v.fs, filename)
if err != nil { if err != nil {
return err return err
} }
@ -1460,7 +1476,11 @@ func (v *Viper) getConfigType() string {
return v.configType return v.configType
} }
cf := v.getConfigFile() cf, err := v.getConfigFile()
if err != nil {
return ""
}
ext := filepath.Ext(cf) ext := filepath.Ext(cf)
if len(ext) > 1 { if len(ext) > 1 {
@ -1470,15 +1490,15 @@ func (v *Viper) getConfigType() string {
return "" return ""
} }
func (v *Viper) getConfigFile() string { func (v *Viper) getConfigFile() (string, error) {
// if explicitly set, then use it // if explicitly set, then use it
if v.configFile != "" { if v.configFile != "" {
return v.configFile return v.configFile, nil
} }
cf, err := v.findConfigFile() cf, err := v.findConfigFile()
if err != nil { if err != nil {
return "" return "", err
} }
v.configFile = cf v.configFile = cf

View file

@ -243,7 +243,9 @@ func (s *stringValue) String() string {
func TestBasics(t *testing.T) { func TestBasics(t *testing.T) {
SetConfigFile("/tmp/config.yaml") 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) { func TestDefault(t *testing.T) {
@ -745,7 +747,7 @@ func TestWrongDirsSearchNotFound(t *testing.T) {
v.AddConfigPath(`thispathaintthere`) v.AddConfigPath(`thispathaintthere`)
err := v.ReadInConfig() 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 // Even though config did not load and the error might have
// been ignored by the client, the default still loads // been ignored by the client, the default still loads
@ -915,7 +917,11 @@ func TestUnmarshalingWithAliases(t *testing.T) {
func TestSetConfigNameClearsFileCache(t *testing.T) { func TestSetConfigNameClearsFileCache(t *testing.T) {
SetConfigFile("/tmp/config.yaml") SetConfigFile("/tmp/config.yaml")
SetConfigName("default") SetConfigName("default")
assert.Empty(t, v.getConfigFile()) f, err := v.getConfigFile()
if err == nil {
t.Fatalf("config file cache should have been cleared")
}
assert.Empty(t, f)
} }
func TestShadowedNestedValue(t *testing.T) { func TestShadowedNestedValue(t *testing.T) {