using System.Diagnostics.CodeAnalysis; namespace NeonSprawl.Server.Game.Quests; /// Adapter over (NEO-114). public sealed class QuestDefinitionRegistry(QuestDefinitionCatalog catalog) : IQuestDefinitionRegistry { private readonly IReadOnlyList _definitionsInIdOrder = BuildDefinitionsInIdOrder(catalog); /// public bool TryGetDefinition(string? questId, [NotNullWhen(true)] out QuestDefRow? definition) { if (questId is null) { definition = null; return false; } return catalog.TryGetQuest(questId, out definition); } /// public bool TryNormalizeKnown(string? rawQuestId, [NotNullWhen(true)] out string normalized) { if (rawQuestId is null) { normalized = string.Empty; return false; } normalized = rawQuestId.Trim().ToLowerInvariant(); if (normalized.Length == 0) { normalized = string.Empty; return false; } return catalog.TryGetQuest(normalized, out _); } /// public IReadOnlyList GetDefinitionsInIdOrder() => _definitionsInIdOrder; private static IReadOnlyList BuildDefinitionsInIdOrder(QuestDefinitionCatalog catalog) { var ids = catalog.ById.Keys.OrderBy(k => k, StringComparer.Ordinal).ToArray(); var list = new List(ids.Length); foreach (var id in ids) { list.Add(catalog.ById[id]); } return list; } }