#nullable enable using System; using OpenNest.Engine.Jobs.Placement; namespace OpenNest.Engine.Jobs; public enum EngineNameKind { FillStrategy, JobEngine, Unknown, } /// The trimmed caller name. /// Canonical strategy name when is FillStrategy. public readonly record struct EngineNameClassification(EngineNameKind Kind, string Name, string? FillStrategy) { public bool IsFillStrategy => Kind == EngineNameKind.FillStrategy; public bool IsJobEngine => Kind == EngineNameKind.JobEngine; } /// /// Classifies a name from a front end selector that accepts both single-plate fill strategies /// () and whole-job engines (). /// Fill strategies win, so "Fill" and "Strip" resolve as strategies; an omitted name means /// . Front ends keep their own message wording. /// public static class EngineNameResolver { public static EngineNameClassification Classify(string? name) { var trimmed = name?.Trim() ?? string.Empty; try { return new(EngineNameKind.FillStrategy, trimmed, PlateFillService.ResolveStrategy(trimmed)); } catch (NotSupportedException) { var kind = NestingEngineRegistry.ResolveName(trimmed) != null ? EngineNameKind.JobEngine : EngineNameKind.Unknown; return new(kind, trimmed, null); } } }