namespace PRecAnnot.Application; public sealed record PRecAnnotCommandDescriptor { public required string CommandName { get; init; } public required string DisplayName { get; init; } public required string UseCaseId { get; init; } public required string RibbonPanel { get; init; } public bool RequiresPlantProject { get; init; } public bool RequiresOrthoDrawing { get; init; } public bool RequiresSelection { get; init; } public string Status { get; init; } = "BLOCKED_WITH_REASON"; } public sealed class CommandRegistry { private readonly IReadOnlyDictionary _commands; public CommandRegistry(IEnumerable commands) { var list = commands.ToList(); if (list.GroupBy(x => x.CommandName, StringComparer.OrdinalIgnoreCase).Any(x => x.Count() > 1)) throw new ArgumentException("Command names must be unique.", nameof(commands)); _commands = list.ToDictionary(x => x.CommandName, StringComparer.OrdinalIgnoreCase); } public IReadOnlyCollection Commands => _commands.Values.ToArray(); public bool TryGet(string name, out PRecAnnotCommandDescriptor? descriptor) => _commands.TryGetValue(name, out descriptor); public static CommandRegistry Foundation() => new(new[] { new PRecAnnotCommandDescriptor { CommandName = "PHP_REC_ANNOT", DisplayName = "Аннотировать", UseCaseId = "ortho-annotation", RibbonPanel = "Аннотации", RequiresPlantProject = true, RequiresOrthoDrawing = true, Status = "BLOCKED_WITH_REASON" }, new PRecAnnotCommandDescriptor { CommandName = "PXP-AAV", DisplayName = "Разместить аннотации автоматически", UseCaseId = "auto-annotate-view", RibbonPanel = "Аннотации", RequiresPlantProject = true, RequiresOrthoDrawing = true, Status = "BLOCKED_WITH_REASON" }, new PRecAnnotCommandDescriptor { CommandName = "PXP-OA", DisplayName = "Разместить осевые линии и опоры", UseCaseId = "ortho-axes-supports", RibbonPanel = "Осевые линии и опоры", RequiresPlantProject = true, RequiresOrthoDrawing = true, Status = "BLOCKED_WITH_REASON" } }); }