package config import ( "errors" "fmt" "os" "strconv" "time" ) type Config struct { Env string HTTPAddr string DatabaseURL string JWKSURL string RequestTimeout time.Duration ShutdownTimeout time.Duration } func Load() (Config, error) { cfg := Config{ Env: getenv("APP_ENV", "development"), HTTPAddr: getenv("HTTP_ADDR", ":8080"), DatabaseURL: os.Getenv("DATABASE_URL"), JWKSURL: os.Getenv("JWKS_URL"), RequestTimeout: getDuration("REQUEST_TIMEOUT", 10*time.Second), ShutdownTimeout: getDuration("SHUTDOWN_TIMEOUT", 10*time.Second), } if cfg.DatabaseURL == "" { return Config{}, errors.New("DATABASE_URL is required") } if cfg.JWKSURL == "" { return Config{}, errors.New("JWKS_URL is required") } return cfg, nil } func getenv(key, fallback string) string { if val := os.Getenv(key); val != "" { return val } return fallback } func getDuration(key string, fallback time.Duration) time.Duration { if val := os.Getenv(key); val != "" { parsed, err := time.ParseDuration(val) if err == nil { return parsed } } return fallback } func MustLoad() Config { cfg, err := Load() if err != nil { panic(fmt.Errorf("config load failed: %w", err)) } return cfg } func GetBool(key string, fallback bool) bool { val := os.Getenv(key) if val == "" { return fallback } parsed, err := strconv.ParseBool(val) if err != nil { return fallback } return parsed }