< Summary

Information
Class: TeleFlow.Telegram.Internal.Handlers.TelegramCallbackHandlerCandidateSet
Assembly: TeleFlow.Framework
File(s): /_/src/TeleFlow.Framework/Internal/Handlers/TelegramCallbackHandlerCandidateSet.cs
Line coverage
100%
Covered lines: 33
Uncovered lines: 0
Coverable lines: 33
Total lines: 85
Line coverage: 100%
Branch coverage
71%
Covered branches: 10
Total branches: 14
Branch coverage: 71.4%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
get_HasStatefulCandidates()50%22100%
GetStatefulTypedCandidates(...)50%22100%
GetStatefulRawCandidates(...)50%22100%
Create(...)87.5%88100%

File(s)

/_/src/TeleFlow.Framework/Internal/Handlers/TelegramCallbackHandlerCandidateSet.cs

#LineLine coverage
 1namespace TeleFlow.Telegram.Internal.Handlers;
 2
 3/// <summary>
 4/// Groups callback handler candidates by state and payload shape so callback dispatch can preserve
 5/// typed-before-raw routing without scanning unrelated callback handlers on every callback query.
 6/// </summary>
 7internal sealed class TelegramCallbackHandlerCandidateSet
 8{
 9    private readonly IReadOnlyDictionary<string, IReadOnlyList<TelegramHandlerCandidate>> _statefulTypedByState;
 10    private readonly IReadOnlyDictionary<string, IReadOnlyList<TelegramHandlerCandidate>> _statefulRawByState;
 11
 12    private TelegramCallbackHandlerCandidateSet(
 13        IReadOnlyList<TelegramHandlerCandidate> statelessTyped,
 14        IReadOnlyList<TelegramHandlerCandidate> statelessRaw,
 15        IReadOnlyDictionary<string, IReadOnlyList<TelegramHandlerCandidate>> statefulTypedByState,
 16        IReadOnlyDictionary<string, IReadOnlyList<TelegramHandlerCandidate>> statefulRawByState)
 17    {
 18        StatelessTyped = statelessTyped;
 19        StatelessRaw = statelessRaw;
 20220        _statefulTypedByState = statefulTypedByState;
 20221        _statefulRawByState = statefulRawByState;
 20222    }
 23
 24    public IReadOnlyList<TelegramHandlerCandidate> StatelessTyped { get; }
 25
 26    public IReadOnlyList<TelegramHandlerCandidate> StatelessRaw { get; }
 27
 16928    public bool HasStatefulCandidates => _statefulTypedByState.Count > 0 || _statefulRawByState.Count > 0;
 29
 30    public IReadOnlyList<TelegramHandlerCandidate> GetStatefulTypedCandidates(string currentState)
 31    {
 132        return _statefulTypedByState.TryGetValue(currentState, out var candidates)
 133            ? candidates
 134            : TelegramHandlerCandidateStateIndex.EmptyCandidates;
 35    }
 36
 37    public IReadOnlyList<TelegramHandlerCandidate> GetStatefulRawCandidates(string currentState)
 38    {
 139        return _statefulRawByState.TryGetValue(currentState, out var candidates)
 140            ? candidates
 141            : TelegramHandlerCandidateStateIndex.EmptyCandidates;
 42    }
 43
 44    public static TelegramCallbackHandlerCandidateSet Create(IReadOnlyList<TelegramHandlerDescriptor> handlers)
 45    {
 20246        ArgumentNullException.ThrowIfNull(handlers);
 47
 20248        var statelessTyped = new List<TelegramHandlerCandidate>();
 20249        var statelessRaw = new List<TelegramHandlerCandidate>();
 20250        var statefulTyped = new Dictionary<string, List<TelegramHandlerCandidate>>(StringComparer.Ordinal);
 20251        var statefulRaw = new Dictionary<string, List<TelegramHandlerCandidate>>(StringComparer.Ordinal);
 52
 92253        for (var index = 0; index < handlers.Count; index++)
 54        {
 25955            var handler = handlers[index];
 25956            var candidate = TelegramHandlerCandidate.Create(handler);
 25957            var isTyped = handler.CallbackPayloadType is not null;
 58
 25959            if (handler.States.Count == 0)
 60            {
 25861                if (isTyped)
 62                {
 4363                    statelessTyped.Add(candidate);
 64                }
 65                else
 66                {
 21567                    statelessRaw.Add(candidate);
 68                }
 69
 21570                continue;
 71            }
 72
 173            TelegramHandlerCandidateStateIndex.Add(
 174                isTyped ? statefulTyped : statefulRaw,
 175                handler.States,
 176                candidate);
 77        }
 78
 20279        return new TelegramCallbackHandlerCandidateSet(
 20280            statelessTyped.ToArray(),
 20281            statelessRaw.ToArray(),
 20282            TelegramHandlerCandidateStateIndex.Freeze(statefulTyped),
 20283            TelegramHandlerCandidateStateIndex.Freeze(statefulRaw));
 84    }
 85}