using Core.Entities; namespace Core.Printing; /// /// Per-student event-rank merge tokens. Rank1 is the official event name /// at rank 1; Rank1.ShortName is the catalog short name. Every rank /// through is always a map key so a /// missing preference prints blank instead of leaving {{Rank5}} visible. /// public static class StudentRankTokens { public static string NameToken(int rank) => $"Rank{rank}"; public static string ShortNameToken(int rank) => $"Rank{rank}.ShortName"; public static string AttributesToken(int rank) => $"Rank{rank}.Attributes"; public static IReadOnlyList AllNames { get; } = [ NoteTemplateMerger.RankedEventsToken, .. Enumerable.Range(1, StudentEventRanking.MaxRank) .SelectMany(rank => (string[]) [ NameToken(rank), ShortNameToken(rank), AttributesToken(rank) ]) ]; public static Dictionary FromRankings(IEnumerable? rankings) { var map = new Dictionary(StringComparer.OrdinalIgnoreCase); for (var rank = 1; rank <= StudentEventRanking.MaxRank; rank++) { map[NameToken(rank)] = null; map[ShortNameToken(rank)] = null; map[AttributesToken(rank)] = null; } if (rankings is null) return map; foreach (var ranking in rankings) { if (ranking.Rank < 1 || ranking.Rank > StudentEventRanking.MaxRank) continue; var evt = ranking.EventDefinition; map[NameToken(ranking.Rank)] = evt?.Name; map[ShortNameToken(ranking.Rank)] = evt?.ShortName; map[AttributesToken(ranking.Rank)] = EventAttributeMarks.For(evt); } return map; } }