<PackageReference Include="Polly.Core" Version="8.0.0" />

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); } } }