package config import ( "fmt" "os" "strconv" "time" ) type Config struct { Environment string HTTPAddress string DatabaseURL string SessionSecret string CookieSecure bool ShutdownTimeout time.Duration } func Load() (Config, error) { cfg := Config{ Environment: value("BELL_ENV", "development"), HTTPAddress: value("BELL_HTTP_ADDRESS", "127.0.0.1:8082"), DatabaseURL: os.Getenv("BELL_DATABASE_URL"), SessionSecret: os.Getenv("BELL_SESSION_SECRET"), ShutdownTimeout: 10 * time.Second, } if raw := os.Getenv("BELL_SHUTDOWN_SECONDS"); raw != "" { seconds, err := strconv.Atoi(raw) if err != nil || seconds < 1 || seconds > 300 { return Config{}, fmt.Errorf("BELL_SHUTDOWN_SECONDS must be between 1 and 300") } cfg.ShutdownTimeout = time.Duration(seconds) * time.Second } if cfg.DatabaseURL == "" { return Config{}, fmt.Errorf("BELL_DATABASE_URL is required") } if len(cfg.SessionSecret) < 32 { return Config{}, fmt.Errorf("BELL_SESSION_SECRET must contain at least 32 characters") } cfg.CookieSecure = cfg.Environment == "production" return cfg, nil } func value(name, fallback string) string { if value := os.Getenv(name); value != "" { return value } return fallback }