using System.Collections.Generic; using System.Threading.Tasks; using Serilog; using Wino.Core.Domain.Interfaces; using Wino.Core.Domain.Models.Synchronization; namespace Wino.Core.Services; /// /// Factory for handling synchronizer errors /// public class SynchronizerErrorHandlingFactory { private readonly ILogger _logger = Log.ForContext(); private readonly List _handlers = new(); /// /// Registers an error handler /// /// The handler to register public void RegisterHandler(ISynchronizerErrorHandler handler) { _handlers.Add(handler); } /// /// Handles an error using the registered handlers /// /// The error to handle /// True if the error was handled, false otherwise public async Task HandleErrorAsync(SynchronizerErrorContext error) { foreach (var handler in _handlers) { if (handler.CanHandle(error)) { _logger.Debug("Found handler {HandlerType} for error code {ErrorCode} message {ErrorMessage}", handler.GetType().Name, error.ErrorCode, error.ErrorMessage); var handled = await handler.HandleAsync(error); error.WasHandled = handled; error.HandledBy = handled ? handler.GetType().Name : null; return handled; } } _logger.Debug("No handler found for error code {ErrorCode} message {ErrorMessage}", error.ErrorCode, error.ErrorMessage); error.WasHandled = false; error.HandledBy = null; return false; } }