using SharedLibraryCore.Interfaces; using System; using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using ILogger = Microsoft.Extensions.Logging.ILogger; namespace IW4MAdmin.Application.Misc { class MiddlewareActionHandler : IMiddlewareActionHandler { private readonly IDictionary> _actions; private readonly ILogger _logger; public MiddlewareActionHandler(ILogger logger) { _actions = new Dictionary>(); _logger = logger; } /// /// Executes the action with the given name /// /// Execution return type /// Input value /// Name of action to execute /// public async Task Execute(T value, string name = null) { string key = string.IsNullOrEmpty(name) ? typeof(T).ToString() : name; if (_actions.ContainsKey(key)) { foreach (var action in _actions[key]) { try { value = await ((IMiddlewareAction)action).Invoke(value); } catch (Exception e) { _logger.LogWarning(e, "Failed to invoke middleware action {name}", name); } } return value; } return value; } /// /// Registers an action by name /// /// /// Action type specifier /// Action to perform /// Name of action public void Register(T actionType, IMiddlewareAction action, string name = null) { string key = string.IsNullOrEmpty(name) ? typeof(T).ToString() : name; if (_actions.ContainsKey(key)) { _actions[key].Add(action); } else { _actions.Add(key, new[] { action }); } } } }