package config import ( "time" "github.com/spf13/viper" ) type ServerConfig struct { Host string `mapstructure:"host"` Port int `mapstructure:"port"` Timeout time.Duration `mapstructure:"timeout"` ReadTimeout time.Duration `mapstructure:"read_timeout"` WriteTimeout time.Duration `mapstructure:"write_timeout"` } type DatabaseConfig struct { MongoDB MongoConfig `mapstructure:"mongodb"` } type MongoConfig struct { URI string `mapstructure:"uri"` Name string `mapstructure:"name"` Timeout time.Duration `mapstructure:"timeout"` MaxPoolSize int `mapstructure:"max_pool_size"` } type CacheConfig struct { Redis RedisConfig `mapstructure:"redis"` } type RedisConfig struct { Host string `mapstructure:"host"` Port int `mapstructure:"port"` Password string `mapstructure:"password"` DB int `mapstructure:"db"` PoolSize int `mapstructure:"pool_size"` } type LoggingConfig struct { Level string `mapstructure:"level"` Format string `mapstructure:"format"` Output string `mapstructure:"output"` File LogFileConfig `mapstructure:"file"` } type LogFileConfig struct { Path string `mapstructure:"path"` MaxSize int `mapstructure:"max_size"` // MB MaxBackups int `mapstructure:"max_backups"` MaxAge int `mapstructure:"max_age"` // days Compress bool `mapstructure:"compress"` } type RateLimitConfig struct { RequestsPerMinute int `mapstructure:"requests_per_minute"` Burst int `mapstructure:"burst"` } // LoadConfig loads configuration from file and environment variables func LoadConfig[T any](path string, config T) (T, error) { viper.SetConfigName("config") viper.SetConfigType("yaml") viper.AddConfigPath(path) // Enable reading from environment variables viper.AutomaticEnv() // Read configuration file if err := viper.ReadInConfig(); err != nil { return config, err } if err := viper.Unmarshal(config); err != nil { return config, err } return config, nil }