package config import ( "strings" "github.com/spf13/viper" ) type Config struct { OSI OSIConfig `mapstructure:"osi"` PHIS PHISConfig `mapstructure:"phis"` Redis RedisConfig `mapstructure:"redis"` ReportLogFileDir string `mapstructure:"report_log_file_dir"` RetryMax int `mapstructure:"retry_max"` CircuitFailThreshold int `mapstructure:"circuit_fail_threshold"` CircuitSleepSec int `mapstructure:"circuit_sleep_sec"` } type OSIConfig struct { BaseURL string `mapstructure:"base_url"` OrgCode string `mapstructure:"org_code"` UserName string `mapstructure:"user_name"` Ask string `mapstructure:"ask"` DeviceSN string `mapstructure:"device_sn"` OperateUser string `mapstructure:"operate_user"` TimeoutSec int `mapstructure:"timeout_sec"` Socks5Proxy string `mapstructure:"socks5_proxy"` } type PHISConfig struct { BaseURL string `mapstructure:"base_url"` Token string `mapstructure:"token"` RegionCode string `mapstructure:"region_code"` PollIntervalSec int `mapstructure:"poll_interval_sec"` } type RedisConfig struct { Addr string `mapstructure:"addr"` DB int `mapstructure:"db"` } func Load(path string) (Config, error) { v := viper.New() setDefaults(v) bindEnv(v) if path != "" { v.SetConfigFile(path) v.SetConfigType("yaml") if err := v.ReadInConfig(); err != nil { if _, ok := err.(viper.ConfigFileNotFoundError); !ok { return Config{}, err } } } var cfg Config if err := v.Unmarshal(&cfg); err != nil { return Config{}, err } return cfg, nil } func setDefaults(v *viper.Viper) { v.SetDefault("osi.base_url", "http://") v.SetDefault("osi.timeout_sec", 20) v.SetDefault("phis.poll_interval_sec", 5) v.SetDefault("redis.db", 0) v.SetDefault("report_log_file_dir", "logs") v.SetDefault("retry_max", 3) v.SetDefault("circuit_fail_threshold", 5) v.SetDefault("circuit_sleep_sec", 60) } func bindEnv(v *viper.Viper) { v.SetEnvKeyReplacer(strings.NewReplacer(".", "_")) v.AutomaticEnv() for _, key := range []string{ "osi.base_url", "osi.org_code", "osi.user_name", "osi.ask", "osi.device_sn", "osi.operate_user", "osi.timeout_sec", "osi.socks5_proxy", "phis.base_url", "phis.token", "phis.region_code", "phis.poll_interval_sec", "redis.addr", "redis.db", "report_log_file_dir", "retry_max", "circuit_fail_threshold", "circuit_sleep_sec", } { _ = v.BindEnv(key) } }