goveal/config/load.go

51 lines
1 KiB
Go

package config
import (
"github.com/fsnotify/fsnotify"
"github.com/mitchellh/go-homedir"
log "github.com/sirupsen/logrus"
"github.com/spf13/viper"
)
func Load(workingDir, configFile string) (cfg *Components, err error) {
var (
loader = viper.New()
home string
)
cfg = new(Components)
for k, v := range defaults {
loader.SetDefault(k, v)
}
if configFile != "" {
loader.SetConfigFile(configFile)
} else if home, err = homedir.Dir(); err != nil {
return nil, err
} else {
loader.AddConfigPath(home)
loader.AddConfigPath(workingDir)
loader.SetConfigName("goveal")
loader.SetConfigType("yaml")
}
loader.AutomaticEnv()
if err = loader.ReadInConfig(); err == nil {
log.Info("Using config file:", loader.ConfigFileUsed())
cfg.ConfigFileInUse = loader.ConfigFileUsed()
loader.WatchConfig()
} else {
return nil, err
}
loader.OnConfigChange(func(in fsnotify.Event) {
if in.Op == fsnotify.Write {
_ = loader.Unmarshal(cfg)
}
})
err = loader.Unmarshal(cfg)
return cfg, err
}