| | | 1 | | namespace TeleFlow.Telegram.Internal.Handlers; |
| | | 2 | | |
| | | 3 | | /// <summary> |
| | | 4 | | /// Groups command, message, or chat-member handler candidates by state at handler-table construction time so |
| | | 5 | | /// the selector can skip unrelated stateful handlers during incoming Telegram update dispatch. |
| | | 6 | | /// </summary> |
| | | 7 | | internal sealed class TelegramHandlerCandidateSet |
| | | 8 | | { |
| | | 9 | | private readonly IReadOnlyDictionary<string, IReadOnlyList<TelegramHandlerCandidate>> _statefulByState; |
| | | 10 | | |
| | | 11 | | private TelegramHandlerCandidateSet( |
| | | 12 | | IReadOnlyList<TelegramHandlerCandidate> stateless, |
| | | 13 | | IReadOnlyDictionary<string, IReadOnlyList<TelegramHandlerCandidate>> statefulByState) |
| | | 14 | | { |
| | | 15 | | Stateless = stateless; |
| | 606 | 16 | | _statefulByState = statefulByState; |
| | 606 | 17 | | } |
| | | 18 | | |
| | | 19 | | public IReadOnlyList<TelegramHandlerCandidate> Stateless { get; } |
| | | 20 | | |
| | 572 | 21 | | public bool HasStatefulCandidates => _statefulByState.Count > 0; |
| | | 22 | | |
| | | 23 | | public IReadOnlyList<TelegramHandlerCandidate> GetStatefulCandidates(string currentState) |
| | | 24 | | { |
| | 39 | 25 | | return _statefulByState.TryGetValue(currentState, out var candidates) |
| | 39 | 26 | | ? candidates |
| | 39 | 27 | | : TelegramHandlerCandidateStateIndex.EmptyCandidates; |
| | | 28 | | } |
| | | 29 | | |
| | | 30 | | public static TelegramHandlerCandidateSet Create(IReadOnlyList<TelegramHandlerDescriptor> handlers) |
| | | 31 | | { |
| | 606 | 32 | | ArgumentNullException.ThrowIfNull(handlers); |
| | | 33 | | |
| | 606 | 34 | | var stateless = new List<TelegramHandlerCandidate>(); |
| | 606 | 35 | | var stateful = new Dictionary<string, List<TelegramHandlerCandidate>>(StringComparer.Ordinal); |
| | | 36 | | |
| | 2878 | 37 | | for (var index = 0; index < handlers.Count; index++) |
| | | 38 | | { |
| | 833 | 39 | | var handler = handlers[index]; |
| | 833 | 40 | | var candidate = TelegramHandlerCandidate.Create(handler); |
| | | 41 | | |
| | 833 | 42 | | if (handler.States.Count == 0) |
| | | 43 | | { |
| | 772 | 44 | | stateless.Add(candidate); |
| | 772 | 45 | | continue; |
| | | 46 | | } |
| | | 47 | | |
| | 61 | 48 | | TelegramHandlerCandidateStateIndex.Add(stateful, handler.States, candidate); |
| | | 49 | | } |
| | | 50 | | |
| | 606 | 51 | | return new TelegramHandlerCandidateSet( |
| | 606 | 52 | | stateless.ToArray(), |
| | 606 | 53 | | TelegramHandlerCandidateStateIndex.Freeze(stateful)); |
| | | 54 | | } |
| | | 55 | | } |