namespace Kompas.Mcp.Core.Assemblies; /// /// Чистые валидаторы операций сборки (без COM) — выделены для unit-тестов. /// public static class AssemblyValidation { /// Допустимые расширения файла-источника компонента: деталь (.m3d) и сборка (.a3d). private static readonly HashSet AllowedExtensions = new(StringComparer.OrdinalIgnoreCase) { ".m3d", ".a3d" }; /// /// Нормализовать путь к файлу компонента: обрезать пробелы, проверить непустоту и расширение /// (.m3d/.a3d, без учёта регистра), вернуть абсолютный путь. Существование файла НЕ проверяет /// (это делает сервис на реальной ФС). /// public static string NormalizeComponentPath(string? path) { if (string.IsNullOrWhiteSpace(path)) throw new ArgumentException("Путь к файлу компонента не задан.", nameof(path)); var trimmed = path.Trim(); var ext = Path.GetExtension(trimmed); if (!AllowedExtensions.Contains(ext)) throw new ArgumentException( $"Недопустимое расширение файла компонента '{ext}'. Ожидается .m3d (деталь) или .a3d (сборка).", nameof(path)); return Path.GetFullPath(trimmed); } /// Проверить, что координаты вставки конечны (отсекает NaN/Infinity). public static void RequireFinitePosition(double x, double y, double z) { if (!double.IsFinite(x) || !double.IsFinite(y) || !double.IsFinite(z)) throw new ArgumentException("Координаты вставки компонента должны быть конечными числами (не NaN/Infinity)."); } }