using Telegram.Bot.Types.Enums; using Telegrator.MadiatorCore; using Telegrator.MadiatorCore.Descriptors; namespace Telegrator.Providers { /// /// Provider for managing awaiting handlers that can wait for specific update types. /// Extends HandlersProvider to provide functionality for creating and managing awaiter handlers. /// /// The bot configuration options. public class AwaitingProvider(TelegratorOptions options) : HandlersProvider([], options), IAwaitingProvider { /// /// List of handler descriptors for awaiting handlers. /// protected readonly HandlerDescriptorList HandlersList = []; /// public override bool TryGetDescriptorList(UpdateType updateType, out HandlerDescriptorList? list) { list = HandlersList; return true; } /// public IDisposable UseHandler(HandlerDescriptor handlerDescriptor) { HandlerToken handlerToken = new HandlerToken(HandlersList, handlerDescriptor); handlerToken.Register(); return handlerToken; } /// /// Token for managing the lifetime of a handler in the awaiting provider. /// Implements IDisposable to automatically remove the handler when disposed. /// /// The list of handler descriptors. /// The handler descriptor to manage. private readonly struct HandlerToken(HandlerDescriptorList handlersList, HandlerDescriptor handlerDescriptor) : IDisposable { /// /// Registers the handler descriptor in the handlers list. /// /// Thrown when the handler descriptor has no singleton instance. public readonly void Register() { if (handlerDescriptor.SingletonInstance == null) throw new Exception(); handlersList.Add(handlerDescriptor); } /// /// Disposes of the handler token by removing the handler descriptor from the list. /// public readonly void Dispose() { handlersList.Remove(handlerDescriptor.Indexer); } } } }