namespace KianaBH.KcpSharp.Base; /// /// Helper methods for . /// public static class KcpExceptionProducerExtensions { /// /// Set the handler to invoke when exception is thrown. Return true in the handler to ignore the error and continue /// running. Return false in the handler to abort the operation. /// /// The producer instance. /// The exception handler. public static void SetExceptionHandler(this IKcpExceptionProducer producer, Func handler) { if (producer is null) throw new ArgumentNullException(nameof(producer)); if (handler is null) throw new ArgumentNullException(nameof(handler)); producer.SetExceptionHandler( (ex, conv, state) => ((Func?)state)!.Invoke(ex, conv), handler ); } /// /// Set the handler to invoke when exception is thrown. Return true in the handler to ignore the error and continue /// running. Return false in the handler to abort the operation. /// /// The producer instance. /// The exception handler. public static void SetExceptionHandler(this IKcpExceptionProducer producer, Func handler) { if (producer is null) throw new ArgumentNullException(nameof(producer)); if (handler is null) throw new ArgumentNullException(nameof(handler)); producer.SetExceptionHandler( (ex, conv, state) => ((Func?)state)!.Invoke(ex), handler ); } /// /// Set the handler to invoke when exception is thrown. /// /// The producer instance. /// The exception handler. /// The state object to pass into the exception handler. public static void SetExceptionHandler(this IKcpExceptionProducer producer, Action handler, object? state) { if (producer is null) throw new ArgumentNullException(nameof(producer)); if (handler is null) throw new ArgumentNullException(nameof(handler)); producer.SetExceptionHandler( (ex, conv, state) => { var tuple = (Tuple, object?>)state!; tuple.Item1.Invoke(ex, conv, tuple.Item2); return false; }, Tuple.Create(handler, state) ); } /// /// Set the handler to invoke when exception is thrown. /// /// The producer instance. /// The exception handler. public static void SetExceptionHandler(this IKcpExceptionProducer producer, Action handler) { if (producer is null) throw new ArgumentNullException(nameof(producer)); if (handler is null) throw new ArgumentNullException(nameof(handler)); producer.SetExceptionHandler( (ex, conv, state) => { var handler = (Action)state!; handler.Invoke(ex, conv); return false; }, handler ); } /// /// Set the handler to invoke when exception is thrown. /// /// The producer instance. /// The exception handler. public static void SetExceptionHandler(this IKcpExceptionProducer producer, Action handler) { if (producer is null) throw new ArgumentNullException(nameof(producer)); if (handler is null) throw new ArgumentNullException(nameof(handler)); producer.SetExceptionHandler( (ex, conv, state) => { var handler = (Action)state!; handler.Invoke(ex); return false; }, handler ); } }