FallbackEngine
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace Polly.Fallback
{
internal static class FallbackEngine
{
internal static TResult Implementation<TResult>(Func<Context, CancellationToken, TResult> action, Context context, CancellationToken cancellationToken, IEnumerable<ExceptionPredicate> shouldHandleExceptionPredicates, IEnumerable<ResultPredicate<TResult>> shouldHandleResultPredicates, Action<DelegateResult<TResult>, Context> onFallback, Func<DelegateResult<TResult>, Context, CancellationToken, TResult> fallbackAction)
{
DelegateResult<TResult> arg;
try {
cancellationToken.ThrowIfCancellationRequested();
TResult result = (TResult)action(context, cancellationToken);
if (!shouldHandleResultPredicates.Any((ResultPredicate<TResult> predicate) => predicate((TResult)result)))
return (TResult)result;
arg = new DelegateResult<TResult>((TResult)result);
} catch (Exception ex2) {
Exception ex;
Exception ex3 = ex = ex2;
Exception ex4 = (from predicate in shouldHandleExceptionPredicates
select predicate(ex)).FirstOrDefault((Exception e) => e != null);
if (ex4 == null)
throw;
arg = new DelegateResult<TResult>(ex4);
}
onFallback(arg, context);
return fallbackAction(arg, context, cancellationToken);
}
internal static async Task<TResult> ImplementationAsync<TResult>(Func<Context, CancellationToken, Task<TResult>> action, Context context, IEnumerable<ExceptionPredicate> shouldHandleExceptionPredicates, IEnumerable<ResultPredicate<TResult>> shouldHandleResultPredicates, Func<DelegateResult<TResult>, Context, Task> onFallbackAsync, Func<DelegateResult<TResult>, Context, CancellationToken, Task<TResult>> fallbackAction, CancellationToken cancellationToken, bool continueOnCapturedContext)
{
DelegateResult<TResult> delegateOutcome;
try {
cancellationToken.ThrowIfCancellationRequested();
<>c__DisplayClass1_0<TResult> <>c__DisplayClass1_;
TResult result2 = <>c__DisplayClass1_.result;
TResult result = (TResult)(await action(context, cancellationToken).ConfigureAwait(continueOnCapturedContext));
if (!Enumerable.Any<ResultPredicate<TResult>>(shouldHandleResultPredicates, (Func<ResultPredicate<TResult>, bool>)((ResultPredicate<TResult> predicate) => predicate((TResult)result))))
return (TResult)result;
delegateOutcome = new DelegateResult<TResult>((TResult)result);
} catch (Exception ex2) {
Exception ex = ex2;
Exception ex3 = Enumerable.FirstOrDefault<Exception>(Enumerable.Select<ExceptionPredicate, Exception>(shouldHandleExceptionPredicates, (Func<ExceptionPredicate, Exception>)((ExceptionPredicate predicate) => predicate(ex))), (Func<Exception, bool>)((Exception e) => e != null));
if (ex3 == null)
throw;
delegateOutcome = new DelegateResult<TResult>(ex3);
}
await onFallbackAsync(delegateOutcome, context).ConfigureAwait(continueOnCapturedContext);
return await fallbackAction(delegateOutcome, context, cancellationToken).ConfigureAwait(continueOnCapturedContext);
}
}
}