package config import ( "errors" "fmt" "os" "path/filepath" "sig-pub/pkg/zlog" "strings" "github.com/spf13/viper" ) func parseConfPath(confPath string) (filePath, fileName, confType string) { filePath, fileName = filepath.Split(confPath) ext := filepath.Ext(fileName) fileName, _ = strings.CutSuffix(fileName, ext) confType, _ = strings.CutPrefix(ext, ".") confType = strings.ToLower(confType) return } func LoadConfig[T any](conf T, confPathArg ...string) (T, error) { v, err := loadViper(confPathArg...) if err != nil { return conf, err } if err := v.Unmarshal(conf); err != nil { err = errors.New("viper unmarshal config failed: " + err.Error()) return conf, err } return conf, nil } func MustLoadConfig[T any](conf T, confPathArg ...string) T { v, err := loadViper(confPathArg...) if err != nil { panic(err) } if err := v.Unmarshal(conf); err != nil { panic(errors.New("viper unmarshal config failed: " + err.Error())) } return conf } // loadViper load config.toml // appConf service custom config // return common service configuration func loadViper(confPathArg ...string) (v *viper.Viper, err error) { confPath := "" confName := "config" confType := "toml" envPrefix := "SIG" if len(confPathArg) > 0 { confPath = confPathArg[0] } confPath, confName, confType = parseConfPath(confPath) if confPath == "" { confPath = "./" } filePath := fmt.Sprintf("%s%s.%s", confPath, confName, confType) dir, err := os.Getwd() if err != nil { zlog.Warning(err) } else { filePath = filepath.Join(dir, filePath) } zlog.Infof("use config file: %s, env prefix=%s\n", filePath, envPrefix) v = viper.New() v.AddConfigPath(confPath) v.SetConfigName(confName) v.SetConfigType(confType) v.SetEnvPrefix(envPrefix) v.AutomaticEnv() v.AllowEmptyEnv(true) if err := v.ReadInConfig(); err != nil { return nil, errors.New("viper read config fail: " + err.Error()) } return v, nil }