package config import ( log "github.com/sirupsen/logrus" "github.com/spf13/viper" ) type Config struct { BindAddress string `mapstructure:"bind_address"` Port string `mapstructure:"listen_port"` DownloadChunks int `mapstructure:"download_chunks"` IPInfoAPIKey string `mapstructure:"ipinfo_api_key"` StatsPassword string `mapstructure:"statistics_password"` RedactIP bool `mapstructure:"redact_ip_addresses"` DatabaseType string `mapstructure:"database_type"` DatabaseHostname string `mapstructure:"database_hostname"` DatabaseName string `mapstructure:"database_name"` DatabaseUsername string `mapstructure:"database_username"` DatabasePassword string `mapstructure:"database_password"` DatabaseFile string `mapstructure:"database_file"` } var ( loadedConfig *Config = nil ) func init() { viper.SetDefault("listen_port", "8989") viper.SetDefault("download_chunks", 4) viper.SetDefault("distance_unit", "K") viper.SetDefault("enable_cors", false) viper.SetDefault("statistics_password", "PASSWORD") viper.SetDefault("redact_ip_addresses", false) viper.SetDefault("database_type", "postgresql") viper.SetDefault("database_hostname", "localhost") viper.SetDefault("database_name", "speedtest") viper.SetDefault("database_username", "postgres") viper.SetConfigName("settings") viper.AddConfigPath(".") } func Load() Config { var conf Config if err := viper.ReadInConfig(); err != nil { if _, ok := err.(viper.ConfigFileNotFoundError); ok { log.Warnf("No config file found in search paths, using default values") } else { log.Fatalf("Error reading config: %+v", err) } } if err := viper.Unmarshal(&conf); err != nil { log.Fatalf("Error parsing config: %s", err) } loadedConfig = &conf return conf } func LoadedConfig() *Config { if loadedConfig == nil { Load() } return loadedConfig }