Allow config files to inherit from other config files

This commit is contained in:
Vikram Rangnekar
2019-10-28 01:48:04 -04:00
parent 34867a2733
commit f8aac8d4d7
7 changed files with 46 additions and 203 deletions

View File

@ -150,13 +150,25 @@ func initLog() *zerolog.Logger {
}
func initConf() (*config, error) {
vi := newConfig()
vi := newConfig(getConfigName())
if err := vi.ReadInConfig(); err != nil {
return nil, err
}
c := &config{}
inherit := vi.GetString("inherit")
if len(inherit) != 0 {
vi = newConfig(inherit)
if err := vi.ReadInConfig(); err != nil {
return nil, err
}
vi.SetConfigName(getConfigName())
vi.MergeInConfig()
}
c := &config{Viper: vi}
if err := vi.Unmarshal(c); err != nil {
return nil, fmt.Errorf("unable to decode config, %v", err)

View File

@ -15,13 +15,12 @@ func cmdConfDump(cmd *cobra.Command, args []string) {
fname := fmt.Sprintf("%s.%s", getConfigName(), args[0])
vi := newConfig()
if err := vi.ReadInConfig(); err != nil {
logger.Fatal().Err(err).Send()
conf, err := initConf()
if err != nil {
logger.Fatal().Err(err).Msg("failed to read config")
}
if err := vi.WriteConfigAs(fname); err != nil {
if err := conf.Viper.WriteConfigAs(fname); err != nil {
logger.Fatal().Err(err).Send()
}

View File

@ -9,6 +9,8 @@ import (
)
type config struct {
*viper.Viper
AppName string `mapstructure:"app_name"`
Env string
HostPort string `mapstructure:"host_port"`
@ -134,16 +136,16 @@ type configRole struct {
}
}
func newConfig() *viper.Viper {
func newConfig(name string) *viper.Viper {
vi := viper.New()
vi.SetEnvPrefix("SG")
vi.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))
vi.AutomaticEnv()
vi.SetConfigName(name)
vi.AddConfigPath(confPath)
vi.AddConfigPath("./config")
vi.SetConfigName(getConfigName())
vi.SetDefault("host_port", "0.0.0.0:8080")
vi.SetDefault("web_ui", false)

View File

@ -148,7 +148,15 @@ func startHTTP() {
db.Close()
})
fmt.Printf("%s listening on %s (%s)\n", serverName, hostPort, conf.Env)
var ident string
if len(conf.AppName) == 0 {
ident = conf.Env
} else {
ident = conf.AppName
}
fmt.Printf("%s listening on %s (%s)\n", serverName, hostPort, ident)
if err := srv.ListenAndServe(); err != http.ErrServerClosed {
logger.Error().Err(err).Msg("server closed")