package config import ( "fmt" "log/slog" "strings" "github.com/spf13/viper" ) var ( CfgFile string Verbose int Overwrite bool ServerName string Config CliConfig ) type Server struct { Url string `mapstructure:"url"` Username string `mapstructure:"username"` Password string `mapstructure:"password"` } type CliConfig struct { ApiVersion string Server map[string]Server `mapstructure:"server"` } func InitCliConfig() { slog.Info("InitCliConfig") if CfgFile != "" { viper.SetConfigFile(CfgFile) } else { viper.SetConfigName("kli") // without extension viper.SetConfigType("yaml") viper.AddConfigPath(".") // look for config in working directory viper.AddConfigPath("/home/tpeetz/.config") } // Read the configuration file if err := viper.ReadInConfig(); err != nil { // Handle the case where config file is not found if _, ok := err.(viper.ConfigFileNotFoundError); ok { slog.Info("No config file found, using defaults") if err := viper.SafeWriteConfig(); err != nil { slog.Info("error writing config file", "error", err.Error()) } } else { slog.Info("error reading config file", "error", err.Error()) } } else { slog.Info("initConfig", "Using config file: ", viper.ConfigFileUsed()) if err := viper.Unmarshal(&Config); err != nil { slog.Info("parsing of config file failed", "error", err.Error()) } } } func InitConfig() error { viper.SetDefault("db.host", "localhost") viper.SetDefault("db.port", 5432) viper.SetDefault("db.name", "kontor") viper.SetDefault("db.user", "kontor") viper.SetDefault("db.password", "kontor") viper.SetDefault("port", 8550) viper.SetDefault("gin.mode", "release") viper.SetConfigName("kontor-gin") viper.SetConfigType("yaml") viper.AddConfigPath(".") viper.AddConfigPath("/home/tpeetz/.config") viper.AddConfigPath("/etc/kontor") viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_")) viper.AutomaticEnv() // Read the config file if err := viper.ReadInConfig(); err != nil { // Handle the case where config file is not found if _, ok := err.(viper.ConfigFileNotFoundError); ok { slog.Info("No config file found, using defaults") if err := viper.SafeWriteConfig(); err != nil { slog.Info("error writing config file", "error", err.Error()) return fmt.Errorf("error writing config file: %w", err) } } else { return fmt.Errorf("error reading config file: %w", err) } } else { slog.Info("initConfig", "Using config file: ", viper.ConfigFileUsed()) } return nil }