package config import ( "strings" "github.com/spf13/viper" ) func LoadConfig() (*Config, error) { v := viper.New() v.AutomaticEnv() v.SetConfigName("config") v.SetConfigType("yaml") v.AddConfigPath("./config") v.AddConfigPath(".") if err := v.ReadInConfig(); err != nil { return nil, err } v.SetConfigName(".env") v.SetConfigType("env") if err := v.MergeInConfig(); err != nil { return nil, err } for _, key := range v.AllKeys() { if strings.Contains(key, "_") { nestedKey := strings.Replace(key, "_", ".", 1) if !v.IsSet(nestedKey) || v.Get(nestedKey) == "" { v.Set(nestedKey, v.Get(key)) } } } var cfg Config if err := v.Unmarshal(&cfg); err != nil { return nil, err } return &cfg, nil }