package routing import ( "regexp" "strings" ) const ( DefaultAgentID = "main" DefaultMainKey = "main" DefaultAccountID = "default" MaxAgentIDLength = 64 ) var ( validIDRe = regexp.MustCompile(`^[a-z0-9][a-z0-9_-]{0,63}$`) invalidCharsRe = regexp.MustCompile(`[^a-z0-9_-]+`) leadingDashRe = regexp.MustCompile(`^-+`) trailingDashRe = regexp.MustCompile(`-+$`) ) // NormalizeAgentID sanitizes an agent ID to [a-z0-9][a-z0-9_-]{0,63}. // Invalid characters are collapsed to "-". Leading/trailing dashes stripped. // Empty input returns DefaultAgentID ("main"). func NormalizeAgentID(id string) string { trimmed := strings.TrimSpace(id) if trimmed == "" { return DefaultAgentID } lower := strings.ToLower(trimmed) if validIDRe.MatchString(lower) { return lower } result := invalidCharsRe.ReplaceAllString(lower, "-") result = leadingDashRe.ReplaceAllString(result, "") result = trailingDashRe.ReplaceAllString(result, "") if len(result) > MaxAgentIDLength { result = result[:MaxAgentIDLength] } if result == "" { return DefaultAgentID } return result } // NormalizeAccountID sanitizes an account ID. Empty returns DefaultAccountID. func NormalizeAccountID(id string) string { trimmed := strings.TrimSpace(id) if trimmed == "" { return DefaultAccountID } lower := strings.ToLower(trimmed) if validIDRe.MatchString(lower) { return lower } result := invalidCharsRe.ReplaceAllString(lower, "-") result = leadingDashRe.ReplaceAllString(result, "") result = trailingDashRe.ReplaceAllString(result, "") if len(result) > MaxAgentIDLength { result = result[:MaxAgentIDLength] } if result == "" { return DefaultAccountID } return result }