#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);
}
}
}