package config import ( "fmt" "strings" "github.com/spf13/viper" ) // Config représente la structure globale de la configuration de l'application. type Config struct { Server ServerConfig Database DatabaseConfig } // ServerConfig contient les paramètres de configuration du serveur HTTP. type ServerConfig struct { Address string `mapstructure:"address"` TrustedProxies []string `mapstructure:"trusted_proxies"` // Liste des IPs de proxies de confiance } // DatabaseConfig contient les paramètres de configuration de la base de données. type DatabaseConfig struct { Host string `mapstructure:"host"` Port int `mapstructure:"port"` User string `mapstructure:"user"` Password string `mapstructure:"password"` DBName string `mapstructure:"dbname"` SSLMode string `mapstructure:"sslmode"` } // LoadConfig charge la configuration depuis un fichier et les variables d'environnement. func LoadConfig(path string) (config Config, err error) { viper.AddConfigPath(path) viper.SetConfigName("config") viper.SetConfigType("yaml") viper.SetDefault("server.address", ":8080") viper.SetDefault("server.trusted_proxies", "127.0.0.1, ::1") viper.SetDefault("database.host", "localhost") viper.SetDefault("database.port", 5432) viper.SetDefault("database.user", "default_user") viper.SetDefault("database.password", "") viper.SetDefault("database.dbname", "default_db") viper.SetDefault("database.sslmode", "disable") // L'ordre ici est important // 1. D'abord, on lit le fichier err = viper.ReadInConfig() if err != nil { if _, ok := err.(viper.ConfigFileNotFoundError); !ok { return } } // 2. Ensuite, on prépare Viper à lire les variables d'environnement viper.SetEnvPrefix("APP") viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_")) viper.AutomaticEnv() // Dit à Viper de chercher les variables d'environnement // 3. Enfin, on déverse le résultat final dans la struct. // C'est à ce moment que la surcharge a lieu. fmt.Printf("[%v]\n", config.Database.DBName) err = viper.Unmarshal(&config) return }