10 string historicalToken,
11 IEnumerable<string> universalTokens,
14 string sourceReference,
17 RuleId = NormalizeRequired(ruleId, nameof(ruleId));
19 HistoricalToken = NormalizeRequired(historicalToken, nameof(historicalToken));
20 ArgumentNullException.ThrowIfNull(universalTokens);
22 _universalTokens = universalTokens
24 .Where(token => token.Length > 0)
25 .Distinct(StringComparer.Ordinal)
26 .OrderBy(token => token, StringComparer.Ordinal)
31 SourceReference = NormalizeRequired(sourceReference, nameof(sourceReference));
32 Notes = notes?.Trim() ??
string.Empty;
49 throw new InvalidOperationException(
50 "Historical classification family is invalid.");
55 throw new InvalidOperationException(
56 "Historical mapping confidence is invalid.");
60 _universalTokens.Length != 0)
62 throw new InvalidOperationException(
63 "Source-only rules cannot contain universal projections.");
67 _universalTokens.Length == 0)
69 throw new InvalidOperationException(
70 "Projected rules require at least one universal token.");
76 throw new InvalidOperationException(
77 "Only exact mappings can participate in inverse detection.");
82 IEnumerable<string> universalTokens)
84 string[] normalized = universalTokens
86 .Where(token => token.Length > 0)
87 .Distinct(StringComparer.Ordinal)
88 .OrderBy(token => token, StringComparer.Ordinal)
91 return _universalTokens.SequenceEqual(
93 StringComparer.Ordinal);