package config import ( "os" "strconv" "strings" "time" ) const ( defaultHost = "127.0.0.1" defaultPort = "2005" defaultDBPath = "./hugs_proxy.db" defaultTokenTTLString = "30d" defaultBusyTimeoutMilli = 5000 ) type Config struct { Host string Port string DBPath string DefaultTokenTTL time.Duration BusyTimeoutMS int } func Load() Config { host := getenvOrDefault("HUGS_PROXY_HOST", defaultHost) port := getenvOrDefault("HUGS_PROXY_PORT", defaultPort) dbPath := getenvOrDefault("HUGS_PROXY_DB_PATH", defaultDBPath) ttlRaw := getenvOrDefault("HUGS_PROXY_DEFAULT_TOKEN_TTL", defaultTokenTTLString) busyTimeout := getenvIntOrDefault("HUGS_PROXY_DB_BUSY_TIMEOUT_MS", defaultBusyTimeoutMilli) ttl, err := ParseExpiryDuration(ttlRaw) if err != nil { ttl, _ = ParseExpiryDuration(defaultTokenTTLString) } return Config{ Host: host, Port: port, DBPath: dbPath, DefaultTokenTTL: ttl, BusyTimeoutMS: busyTimeout, } } func ParseExpiryDuration(s string) (time.Duration, error) { s = strings.TrimSpace(strings.ToLower(s)) if strings.HasSuffix(s, "d") { daysPart := strings.TrimSuffix(s, "d") days, err := strconv.Atoi(daysPart) if err != nil { return 0, err } return time.Duration(days) * 24 * time.Hour, nil } return time.ParseDuration(s) } func getenvOrDefault(key string, fallback string) string { v := strings.TrimSpace(os.Getenv(key)) if v == "" { return fallback } return v } func getenvIntOrDefault(key string, fallback int) int { v := strings.TrimSpace(os.Getenv(key)) if v == "" { return fallback } n, err := strconv.Atoi(v) if err != nil { return fallback } return n }