OutcomePipelineBuilderExtensions
Extension methods for adding outcome to a ResiliencePipelineBuilder.
using Polly.Simmy.Outcomes;
using Polly.Utils;
using System;
using System.Diagnostics.CodeAnalysis;
using System.Runtime.CompilerServices;
using System.Threading.Tasks;
namespace Polly.Simmy
{
[System.Runtime.CompilerServices.NullableContext(1)]
[System.Runtime.CompilerServices.Nullable(0)]
internal static class OutcomePipelineBuilderExtensions
{
public static ResiliencePipelineBuilder AddChaosFault(this ResiliencePipelineBuilder builder, bool enabled, double injectionRate, Exception fault)
{
Guard.NotNull(builder, "builder");
builder.AddFaultCore(new FaultStrategyOptions {
Enabled = enabled,
InjectionRate = injectionRate,
Fault = fault
});
return builder;
}
public static ResiliencePipelineBuilder AddChaosFault(this ResiliencePipelineBuilder builder, bool enabled, double injectionRate, [System.Runtime.CompilerServices.Nullable(new byte[] {
1,
2
})] Func<Exception> faultGenerator)
{
Guard.NotNull(builder, "builder");
builder.AddFaultCore(new FaultStrategyOptions {
Enabled = enabled,
InjectionRate = injectionRate,
FaultGenerator = (Func<FaultGeneratorArguments, ValueTask<Exception>>)((FaultGeneratorArguments _) => new ValueTask<Exception>(Task.FromResult(faultGenerator())))
});
return builder;
}
public static ResiliencePipelineBuilder AddChaosFault(this ResiliencePipelineBuilder builder, FaultStrategyOptions options)
{
Guard.NotNull(builder, "builder");
Guard.NotNull(options, "options");
builder.AddFaultCore(options);
return builder;
}
[System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "All options members preserved.")]
private static void AddFaultCore(this ResiliencePipelineBuilder builder, FaultStrategyOptions options)
{
builder.AddStrategy((StrategyBuilderContext context) => new OutcomeChaosStrategy<object>(options, context.Telemetry), options);
}
public static ResiliencePipelineBuilder<TResult> AddChaosFault<[System.Runtime.CompilerServices.Nullable(2)] TResult>(this ResiliencePipelineBuilder<TResult> builder, bool enabled, double injectionRate, Exception fault)
{
Guard.NotNull(builder, "builder");
builder.AddFaultCore(new FaultStrategyOptions {
Enabled = enabled,
InjectionRate = injectionRate,
Fault = fault
});
return builder;
}
public static ResiliencePipelineBuilder<TResult> AddChaosFault<[System.Runtime.CompilerServices.Nullable(2)] TResult>(this ResiliencePipelineBuilder<TResult> builder, bool enabled, double injectionRate, [System.Runtime.CompilerServices.Nullable(new byte[] {
1,
2
})] Func<Exception> faultGenerator)
{
Guard.NotNull(builder, "builder");
builder.AddFaultCore(new FaultStrategyOptions {
Enabled = enabled,
InjectionRate = injectionRate,
FaultGenerator = (Func<FaultGeneratorArguments, ValueTask<Exception>>)((FaultGeneratorArguments _) => new ValueTask<Exception>(Task.FromResult<Exception>(faultGenerator())))
});
return builder;
}
public static ResiliencePipelineBuilder<TResult> AddChaosFault<[System.Runtime.CompilerServices.Nullable(2)] TResult>(this ResiliencePipelineBuilder<TResult> builder, FaultStrategyOptions options)
{
Guard.NotNull(builder, "builder");
Guard.NotNull(options, "options");
builder.AddFaultCore(options);
return builder;
}
public static ResiliencePipelineBuilder<TResult> AddChaosResult<[System.Runtime.CompilerServices.Nullable(2)] TResult>(this ResiliencePipelineBuilder<TResult> builder, bool enabled, double injectionRate, TResult result)
{
Guard.NotNull(builder, "builder");
builder.AddOutcomeCore<TResult, OutcomeStrategyOptions<TResult>>(new OutcomeStrategyOptions<TResult> {
Enabled = enabled,
InjectionRate = injectionRate,
Outcome = new Outcome<TResult>?(new Outcome<TResult>(result))
});
return builder;
}
public static ResiliencePipelineBuilder<TResult> AddChaosResult<[System.Runtime.CompilerServices.Nullable(2)] TResult>(this ResiliencePipelineBuilder<TResult> builder, bool enabled, double injectionRate, [System.Runtime.CompilerServices.Nullable(new byte[] {
1,
2
})] Func<TResult> outcomeGenerator)
{
Guard.NotNull(builder, "builder");
builder.AddOutcomeCore<TResult, OutcomeStrategyOptions<TResult>>(new OutcomeStrategyOptions<TResult> {
Enabled = enabled,
InjectionRate = injectionRate,
OutcomeGenerator = (Func<OutcomeGeneratorArguments, ValueTask<Outcome<TResult>?>>)((OutcomeGeneratorArguments _) => new ValueTask<Outcome<TResult>?>(Task.FromResult<Outcome<TResult>?>((Outcome<TResult>?)Outcome.FromResult<TResult>(outcomeGenerator()))))
});
return builder;
}
public static ResiliencePipelineBuilder<TResult> AddChaosResult<[System.Runtime.CompilerServices.Nullable(2)] TResult>(this ResiliencePipelineBuilder<TResult> builder, OutcomeStrategyOptions<TResult> options)
{
Guard.NotNull(builder, "builder");
Guard.NotNull(options, "options");
builder.AddOutcomeCore<TResult, OutcomeStrategyOptions<TResult>>(options);
return builder;
}
[System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "All options members preserved.")]
private static void AddOutcomeCore<[System.Runtime.CompilerServices.Nullable(2)] TResult, [System.Runtime.CompilerServices.Nullable(2)] [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.All)] TOptions>(this ResiliencePipelineBuilder<TResult> builder, OutcomeStrategyOptions<TResult> options)
{
builder.AddStrategy((StrategyBuilderContext context) => new OutcomeChaosStrategy<TResult>(options, context.Telemetry), options);
}
[System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "All options members preserved.")]
private static void AddFaultCore<[System.Runtime.CompilerServices.Nullable(2)] TResult>(this ResiliencePipelineBuilder<TResult> builder, FaultStrategyOptions options)
{
builder.AddStrategy((StrategyBuilderContext context) => new OutcomeChaosStrategy<TResult>(options, context.Telemetry), options);
}
}
}