ResiliencePipelineBuilderExtensions
Extensions for  ResiliencePipelineBuilderBase.
            
                using Polly.Utils;
using Polly.Utils.Pipeline;
using System;
using System.Diagnostics.CodeAnalysis;
using System.Runtime.CompilerServices;
namespace Polly
{
    [System.Runtime.CompilerServices.NullableContext(1)]
    [System.Runtime.CompilerServices.Nullable(0)]
    public static class ResiliencePipelineBuilderExtensions
    {
        [System.Runtime.CompilerServices.NullableContext(0)]
        internal sealed class EmptyOptions : ResilienceStrategyOptions
        {
            [System.Runtime.CompilerServices.Nullable(1)]
            public static readonly EmptyOptions Instance = new EmptyOptions();
        }
        [UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "The EmptyOptions have nothing to validate.")]
        public static TBuilder AddPipeline<[System.Runtime.CompilerServices.Nullable(0)] TBuilder>(this TBuilder builder, ResiliencePipeline pipeline) where TBuilder : ResiliencePipelineBuilderBase
        {
            Guard.NotNull(builder, "builder");
            Guard.NotNull(pipeline, "pipeline");
            builder.AddPipelineComponent((StrategyBuilderContext _) => PipelineComponentFactory.FromPipeline(pipeline), EmptyOptions.Instance);
            return builder;
        }
        [UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "The EmptyOptions have nothing to validate.")]
        public static ResiliencePipelineBuilder<TResult> AddPipeline<[System.Runtime.CompilerServices.Nullable(2)] TResult>(this ResiliencePipelineBuilder<TResult> builder, ResiliencePipeline<TResult> pipeline)
        {
            Guard.NotNull(builder, "builder");
            Guard.NotNull(pipeline, "pipeline");
            builder.AddPipelineComponent((StrategyBuilderContext _) => PipelineComponentFactory.FromPipeline<TResult>(pipeline), EmptyOptions.Instance);
            return builder;
        }
        [RequiresUnreferencedCode("This call validates the options using the data annotations attributes.\r\nMake sure that the options are included by adding the '[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(OptionsType))]' attribute to the calling method.")]
        public static TBuilder AddStrategy<[System.Runtime.CompilerServices.Nullable(0)] TBuilder>(this TBuilder builder, Func<StrategyBuilderContext, ResilienceStrategy> factory, ResilienceStrategyOptions options) where TBuilder : ResiliencePipelineBuilderBase
        {
            Guard.NotNull(builder, "builder");
            Guard.NotNull(factory, "factory");
            Guard.NotNull(options, "options");
            builder.AddPipelineComponent((StrategyBuilderContext context) => PipelineComponentFactory.FromStrategy(factory(context)), options);
            return builder;
        }
        [RequiresUnreferencedCode("This call validates the options using the data annotations attributes.\r\nMake sure that the options are included by adding the '[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(OptionsType))]' attribute to the calling method.")]
        public static ResiliencePipelineBuilder AddStrategy(this ResiliencePipelineBuilder builder, Func<StrategyBuilderContext, ResilienceStrategy<object>> factory, ResilienceStrategyOptions options)
        {
            Guard.NotNull(builder, "builder");
            Guard.NotNull(factory, "factory");
            Guard.NotNull(options, "options");
            builder.AddPipelineComponent((StrategyBuilderContext context) => PipelineComponentFactory.FromStrategy(factory(context)), options);
            return builder;
        }
        [RequiresUnreferencedCode("This call validates the options using the data annotations attributes.\r\nMake sure that the options are included by adding the '[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(OptionsType))]' attribute to the calling method.")]
        public static ResiliencePipelineBuilder<TResult> AddStrategy<[System.Runtime.CompilerServices.Nullable(2)] TResult>(this ResiliencePipelineBuilder<TResult> builder, Func<StrategyBuilderContext, ResilienceStrategy<TResult>> factory, ResilienceStrategyOptions options)
        {
            Guard.NotNull(builder, "builder");
            Guard.NotNull(factory, "factory");
            Guard.NotNull(options, "options");
            builder.AddPipelineComponent((StrategyBuilderContext context) => PipelineComponentFactory.FromStrategy<TResult>(factory(context)), options);
            return builder;
        }
        [DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(EmptyOptions))]
        [UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "All options members preserved for the empty options.")]
        public static TBuilder AddStrategy<[System.Runtime.CompilerServices.Nullable(0)] TBuilder>(this TBuilder builder, Func<StrategyBuilderContext, ResilienceStrategy> factory) where TBuilder : ResiliencePipelineBuilderBase
        {
            Guard.NotNull(builder, "builder");
            Guard.NotNull(factory, "factory");
            return builder.AddStrategy(factory, EmptyOptions.Instance);
        }
        [DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(EmptyOptions))]
        [UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "All options members preserved for the empty options.")]
        public static ResiliencePipelineBuilder AddStrategy(this ResiliencePipelineBuilder builder, Func<StrategyBuilderContext, ResilienceStrategy<object>> factory)
        {
            Guard.NotNull(builder, "builder");
            Guard.NotNull(factory, "factory");
            return builder.AddStrategy(factory, EmptyOptions.Instance);
        }
        [DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(EmptyOptions))]
        [UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "All options members preserved for the empty options.")]
        public static ResiliencePipelineBuilder<TResult> AddStrategy<[System.Runtime.CompilerServices.Nullable(2)] TResult>(this ResiliencePipelineBuilder<TResult> builder, Func<StrategyBuilderContext, ResilienceStrategy<TResult>> factory)
        {
            Guard.NotNull(builder, "builder");
            Guard.NotNull(factory, "factory");
            return builder.AddStrategy(factory, EmptyOptions.Instance);
        }
    }
}