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).");
}
}