package config import ( "go.uber.org/zap" ) // ConfigDefaults permet de construire une config avec des valeurs par défaut (T0038) type ConfigDefaults struct { appPort *int appEnv *string jwtSecret *string databaseURL *string redisURL *string corsOrigins []string rateLimitLimit *int rateLimitWindow *int logLevel *string logger *zap.Logger } // NewConfigDefaults crée un nouveau builder de defaults (T0038) func NewConfigDefaults() *ConfigDefaults { return &ConfigDefaults{} } // WithPort définit le port par défaut (T0038) func (b *ConfigDefaults) WithPort(port int) *ConfigDefaults { b.appPort = &port return b } // WithEnv définit l'environnement par défaut (T0038) func (b *ConfigDefaults) WithEnv(env string) *ConfigDefaults { b.appEnv = &env return b } // WithJWTSecret définit le secret JWT par défaut (T0038) func (b *ConfigDefaults) WithJWTSecret(secret string) *ConfigDefaults { b.jwtSecret = &secret return b } // WithDatabaseURL définit l'URL de la base de données par défaut (T0038) func (b *ConfigDefaults) WithDatabaseURL(url string) *ConfigDefaults { b.databaseURL = &url return b } // WithRedisURL définit l'URL Redis par défaut (T0038) func (b *ConfigDefaults) WithRedisURL(url string) *ConfigDefaults { b.redisURL = &url return b } // WithCORSOrigins définit les origines CORS par défaut (T0038) func (b *ConfigDefaults) WithCORSOrigins(origins []string) *ConfigDefaults { b.corsOrigins = origins return b } // WithRateLimit définit les limites de rate limiting par défaut (T0038) func (b *ConfigDefaults) WithRateLimit(limit int, windowSeconds int) *ConfigDefaults { b.rateLimitLimit = &limit b.rateLimitWindow = &windowSeconds return b } // WithLogLevel définit le niveau de log par défaut (T0038) func (b *ConfigDefaults) WithLogLevel(level string) *ConfigDefaults { b.logLevel = &level return b } // WithLogger définit le logger par défaut (T0038) func (b *ConfigDefaults) WithLogger(logger *zap.Logger) *ConfigDefaults { b.logger = logger return b } // Build construit une Config avec les valeurs par défaut (T0038) func (b *ConfigDefaults) Build() *Config { config := &Config{} if b.appPort != nil { config.AppPort = *b.appPort } // Note: appEnv n'est pas dans Config, mais peut être utilisé ailleurs if b.jwtSecret != nil { config.JWTSecret = *b.jwtSecret } if b.databaseURL != nil { config.DatabaseURL = *b.databaseURL } if b.redisURL != nil { config.RedisURL = *b.redisURL } if len(b.corsOrigins) > 0 { config.CORSOrigins = b.corsOrigins } if b.rateLimitLimit != nil { config.RateLimitLimit = *b.rateLimitLimit } if b.rateLimitWindow != nil { config.RateLimitWindow = *b.rateLimitWindow } if b.logLevel != nil { config.LogLevel = *b.logLevel } if b.logger != nil { config.Logger = b.logger } return config } // Merge fusionne les valeurs par défaut avec une config existante (override) (T0038) func (b *ConfigDefaults) Merge(config *Config) *Config { if b.appPort != nil { config.AppPort = *b.appPort } if b.jwtSecret != nil { config.JWTSecret = *b.jwtSecret } if b.databaseURL != nil { config.DatabaseURL = *b.databaseURL } if b.redisURL != nil { config.RedisURL = *b.redisURL } if len(b.corsOrigins) > 0 { config.CORSOrigins = b.corsOrigins } if b.rateLimitLimit != nil { config.RateLimitLimit = *b.rateLimitLimit } if b.rateLimitWindow != nil { config.RateLimitWindow = *b.rateLimitWindow } if b.logLevel != nil { config.LogLevel = *b.logLevel } if b.logger != nil { config.Logger = b.logger } return config }