BridgeComponent<T>
using System;
using System.Diagnostics;
using System.Runtime.CompilerServices;
using System.Threading.Tasks;
namespace Polly.Utils.Pipeline
{
[NullableContext(1)]
[Nullable(0)]
[DebuggerDisplay("{Strategy}")]
internal sealed class BridgeComponent<[Nullable(2)] T> : BridgeComponentBase
{
public ResilienceStrategy<T> Strategy { get; }
public BridgeComponent(ResilienceStrategy<T> strategy)
: base(strategy)
{
Strategy = strategy;
}
[return: Nullable(new byte[] {
0,
0,
1
})]
internal override ValueTask<Outcome<TResult>> ExecuteCore<[Nullable(2)] TResult, [Nullable(2)] TState>([Nullable(new byte[] {
1,
1,
1,
0,
0,
1
})] Func<ResilienceContext, TState, ValueTask<Outcome<TResult>>> callback, ResilienceContext context, TState state)
{
Func<ResilienceContext, TState, ValueTask<Outcome<T>>> func = callback as Func<ResilienceContext, TState, ValueTask<Outcome<T>>>;
if (func != null)
return ConvertValueTask<TResult>(this.Strategy.ExecuteCore(func, context, state), context);
return ConvertValueTask<TResult>(this.Strategy.ExecuteCore(delegate(ResilienceContext context, (Func<ResilienceContext, TState, ValueTask<Outcome<TResult>>> callback, TState state) state) {
<>c__4<TResult, TState>.<<ExecuteCore>b__4_0>d stateMachine = default(<>c__4<TResult, TState>.<<ExecuteCore>b__4_0>d);
stateMachine.<>t__builder = AsyncValueTaskMethodBuilder<Outcome<T>>.Create();
stateMachine.context = context;
stateMachine.state = state;
stateMachine.<>1__state = -1;
stateMachine.<>t__builder.Start(ref stateMachine);
return stateMachine.<>t__builder.Task;
}, context, (callback, state)), context);
}
[return: Nullable(new byte[] {
0,
0,
1
})]
private static ValueTask<Outcome<TTo>> ConvertValueTask<[Nullable(2)] TTo>([Nullable(new byte[] {
0,
0,
1
})] ValueTask<Outcome<T>> valueTask, ResilienceContext resilienceContext)
{
if (valueTask.IsCompletedSuccessfully)
return new ValueTask<Outcome<TTo>>(ConvertOutcome<T, TTo>(valueTask.Result));
return <ConvertValueTask>g__ConvertValueTaskAsync|5_0<TTo>(valueTask, resilienceContext);
}
[NullableContext(2)]
[return: Nullable(new byte[] {
0,
1
})]
private static Outcome<TTo> ConvertOutcome<TFrom, TTo>([Nullable(new byte[] {
0,
1
})] Outcome<TFrom> outcome)
{
if (outcome.ExceptionDispatchInfo != null)
return new Outcome<TTo>(outcome.ExceptionDispatchInfo);
if (outcome.Result == null)
return new Outcome<TTo>(default(TTo));
if (typeof(TTo) == typeof(TFrom)) {
TFrom result = outcome.Result;
return new Outcome<TTo>(Unsafe.As<TFrom, TTo>(ref result));
}
return new Outcome<TTo>((TTo)(object)outcome.Result);
}
}
}