using RackPeek.Domain.Resources.Connections; namespace RackPeek.Domain.Persistence; public static class ConnectionMerger { /// /// Merges an imported connections section into the existing set. /// Returns null when the import carries no connections section — the /// existing connections are kept untouched in that case (#308). /// Replace mode swaps the whole set; Merge mode applies the same /// overwrite rule as the UI (a port holds at most one connection, so /// each incoming connection evicts anything touching its endpoints). /// public static List? Merge( IReadOnlyList existing, List? incoming, MergeMode mode) { if (incoming == null) return null; if (mode == MergeMode.Replace) return incoming.ToList(); var merged = existing.ToList(); foreach (Connection connection in incoming) { merged.RemoveAll(c => Touches(c, connection.A) || Touches(c, connection.B)); merged.Add(connection); } return merged; } public static string Describe(Connection c) => $"{Describe(c.A)} <-> {Describe(c.B)}"; private static string Describe(PortReference p) => $"{p.Resource}[{p.PortGroup}.{p.PortIndex}]"; private static bool Touches(Connection c, PortReference port) => PortsMatch(c.A, port) || PortsMatch(c.B, port); private static bool PortsMatch(PortReference a, PortReference b) { return a.Resource.Equals(b.Resource, StringComparison.OrdinalIgnoreCase) && a.PortGroup == b.PortGroup && a.PortIndex == b.PortIndex; } }