FallbackEngine
using System;
using System.Runtime.CompilerServices;
using System.Threading;
namespace Polly.Fallback
{
internal static class FallbackEngine
{
[System.Runtime.CompilerServices.NullableContext(1)]
internal static TResult Implementation<[System.Runtime.CompilerServices.Nullable(2)] TResult>(Func<Context, CancellationToken, TResult> action, Context context, CancellationToken cancellationToken, ExceptionPredicates shouldHandleExceptionPredicates, ResultPredicates<TResult> shouldHandleResultPredicates, Action<DelegateResult<TResult>, Context> onFallback, Func<DelegateResult<TResult>, Context, CancellationToken, TResult> fallbackAction)
{
DelegateResult<TResult> arg;
try {
cancellationToken.ThrowIfCancellationRequested();
TResult result = action(context, cancellationToken);
if (!shouldHandleResultPredicates.AnyMatch(result))
return result;
arg = new DelegateResult<TResult>(result);
} catch (Exception ex) {
Exception ex2 = shouldHandleExceptionPredicates.FirstMatchOrDefault(ex);
if (ex2 == null)
throw;
arg = new DelegateResult<TResult>(ex2);
}
onFallback(arg, context);
return fallbackAction(arg, context, cancellationToken);
}
}
}