File: Generated\Basic.CompilerLog.Util\Basic.CompilerLog.Util.Impl.BasicGeneratedFilesAnalyzerReference\BindingExtensions.g.cs
Project: ..\..\..\src\Libraries\Microsoft.Extensions.Http.Resilience\Microsoft.Extensions.Http.Resilience.csproj (Microsoft.Extensions.Http.Resilience)
// <auto-generated/>
 
#nullable enable annotations
#nullable disable warnings
 
// Suppress warnings about [Obsolete] member usage in generated code.
#pragma warning disable CS0612, CS0618
 
namespace System.Runtime.CompilerServices
{
    using System;
    using System.CodeDom.Compiler;
 
    [GeneratedCode("Microsoft.Extensions.Configuration.Binder.SourceGeneration", "8.0.10.31311")]
    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
    file sealed class InterceptsLocationAttribute : Attribute
    {
        public InterceptsLocationAttribute(string filePath, int line, int column)
        {
        }
    }
}
 
namespace Microsoft.Extensions.Configuration.Binder.SourceGeneration
{
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Options;
    using System;
    using System.CodeDom.Compiler;
    using System.Collections.Generic;
    using System.Globalization;
    using System.Runtime.CompilerServices;
 
    [GeneratedCode("Microsoft.Extensions.Configuration.Binder.SourceGeneration", "8.0.10.31311")]
    file static class BindingExtensions
    {
        #region OptionsBuilder<TOptions> extensions.
        /// <summary>Registers a configuration instance which <typeparamref name="TOptions"/> will bind against.</summary>
        [InterceptsLocation(@"/_/src/Libraries/Microsoft.Extensions.Http.Resilience/Routing/RoutingStrategyBuilderExtensions.cs", 37, 50)]
        [InterceptsLocation(@"/_/src/Libraries/Microsoft.Extensions.Http.Resilience/Routing/RoutingStrategyBuilderExtensions.cs", 82, 51)]
        public static OptionsBuilder<TOptions> Bind<TOptions>(this OptionsBuilder<TOptions> optionsBuilder, IConfiguration config) where TOptions : class
        {
            return Bind(optionsBuilder, config, configureBinder: null);
        }
 
        /// <summary>Registers a configuration instance which <typeparamref name="TOptions"/> will bind against.</summary>
        public static OptionsBuilder<TOptions> Bind<TOptions>(this OptionsBuilder<TOptions> optionsBuilder, IConfiguration config, Action<BinderOptions>? configureBinder) where TOptions : class
        {
            if (optionsBuilder is null)
            {
                throw new ArgumentNullException(nameof(optionsBuilder));
            }
 
            Configure<TOptions>(optionsBuilder.Services, optionsBuilder.Name, config, configureBinder);
            return optionsBuilder;
        }
        #endregion OptionsBuilder<TOptions> extensions.
 
        #region IServiceCollection extensions.
        /// <summary>Registers a configuration instance which TOptions will bind against.</summary>
        [InterceptsLocation(@"/_/src/Libraries/Microsoft.Extensions.Http.Resilience/Hedging/StandardHedgingHandlerBuilderExtensions.cs", 38, 30)]
        [InterceptsLocation(@"/_/src/Libraries/Microsoft.Extensions.Http.Resilience/Resilience/HttpStandardResiliencePipelineBuilderExtensions.cs", 35, 30)]
        public static IServiceCollection Configure<TOptions>(this IServiceCollection services, string? name, IConfiguration config, Action<BinderOptions>? configureOptions) where TOptions : class
        {
            if (services is null)
            {
                throw new ArgumentNullException(nameof(services));
            }
 
            if (config is null)
            {
                throw new ArgumentNullException(nameof(config));
            }
 
            OptionsServiceCollectionExtensions.AddOptions(services);
            services.AddSingleton<IOptionsChangeTokenSource<TOptions>>(new ConfigurationChangeTokenSource<TOptions>(name, config));
            return services.AddSingleton<IConfigureOptions<TOptions>>(new ConfigureNamedOptions<TOptions>(name, instance => BindCoreMain(config, instance, typeof(TOptions), configureOptions)));
        }
        #endregion IServiceCollection extensions.
 
        #region Core binding extensions.
        private readonly static Lazy<HashSet<string>> s_configKeys_HttpTimeoutStrategyOptions = new(() => new HashSet<string>(StringComparer.OrdinalIgnoreCase) { "Timeout", "Name" });
        private readonly static Lazy<HashSet<string>> s_configKeys_HttpHedgingStrategyOptions = new(() => new HashSet<string>(StringComparer.OrdinalIgnoreCase) { "Delay", "MaxHedgedAttempts", "Name" });
        private readonly static Lazy<HashSet<string>> s_configKeys_ConcurrencyLimiterOptions = new(() => new HashSet<string>(StringComparer.OrdinalIgnoreCase) { "PermitLimit", "QueueProcessingOrder", "QueueLimit" });
        private readonly static Lazy<HashSet<string>> s_configKeys_HttpRateLimiterStrategyOptions = new(() => new HashSet<string>(StringComparer.OrdinalIgnoreCase) { "DefaultRateLimiterOptions", "Name" });
        private readonly static Lazy<HashSet<string>> s_configKeys_CircuitBreakerStateProvider = new(() => new HashSet<string>(StringComparer.OrdinalIgnoreCase) { "CircuitState" });
        private readonly static Lazy<HashSet<string>> s_configKeys_HttpCircuitBreakerStrategyOptions = new(() => new HashSet<string>(StringComparer.OrdinalIgnoreCase) { "FailureRatio", "MinimumThroughput", "SamplingDuration", "BreakDuration", "ManualControl", "StateProvider", "Name" });
        private readonly static Lazy<HashSet<string>> s_configKeys_HedgingEndpointOptions = new(() => new HashSet<string>(StringComparer.OrdinalIgnoreCase) { "RateLimiter", "CircuitBreaker", "Timeout" });
        private readonly static Lazy<HashSet<string>> s_configKeys_HttpStandardHedgingResilienceOptions = new(() => new HashSet<string>(StringComparer.OrdinalIgnoreCase) { "TotalRequestTimeout", "Hedging", "Endpoint" });
        private readonly static Lazy<HashSet<string>> s_configKeys_HttpRetryStrategyOptions = new(() => new HashSet<string>(StringComparer.OrdinalIgnoreCase) { "ShouldRetryAfterHeader", "MaxRetryAttempts", "BackoffType", "UseJitter", "Delay", "MaxDelay", "Name" });
        private readonly static Lazy<HashSet<string>> s_configKeys_HttpStandardResilienceOptions = new(() => new HashSet<string>(StringComparer.OrdinalIgnoreCase) { "RateLimiter", "TotalRequestTimeout", "Retry", "CircuitBreaker", "AttemptTimeout" });
        private readonly static Lazy<HashSet<string>> s_configKeys_WeightedUriEndpoint = new(() => new HashSet<string>(StringComparer.OrdinalIgnoreCase) { "Uri", "Weight" });
        private readonly static Lazy<HashSet<string>> s_configKeys_UriEndpointGroup = new(() => new HashSet<string>(StringComparer.OrdinalIgnoreCase) { "Endpoints" });
        private readonly static Lazy<HashSet<string>> s_configKeys_OrderedGroupsRoutingOptions = new(() => new HashSet<string>(StringComparer.OrdinalIgnoreCase) { "Groups" });
        private readonly static Lazy<HashSet<string>> s_configKeys_WeightedUriEndpointGroup = new(() => new HashSet<string>(StringComparer.OrdinalIgnoreCase) { "Weight", "Endpoints" });
        private readonly static Lazy<HashSet<string>> s_configKeys_WeightedGroupsRoutingOptions = new(() => new HashSet<string>(StringComparer.OrdinalIgnoreCase) { "SelectionMode", "Groups" });
 
        public static void BindCoreMain(IConfiguration configuration, object instance, Type type, Action<BinderOptions>? configureOptions)
        {
            if (instance is null)
            {
                return;
            }
 
            if (!HasValueOrChildren(configuration))
            {
                return;
            }
 
            BinderOptions? binderOptions = GetBinderOptions(configureOptions);
 
            if (type == typeof(global::Microsoft.Extensions.Http.Resilience.HttpStandardHedgingResilienceOptions))
            {
                var temp = (global::Microsoft.Extensions.Http.Resilience.HttpStandardHedgingResilienceOptions)instance;
                BindCore(configuration, ref temp, defaultValueIfNotFound: false, binderOptions);
                return;
            }
            else if (type == typeof(global::Microsoft.Extensions.Http.Resilience.HttpStandardResilienceOptions))
            {
                var temp = (global::Microsoft.Extensions.Http.Resilience.HttpStandardResilienceOptions)instance;
                BindCore(configuration, ref temp, defaultValueIfNotFound: false, binderOptions);
                return;
            }
            else if (type == typeof(global::Microsoft.Extensions.Http.Resilience.OrderedGroupsRoutingOptions))
            {
                var temp = (global::Microsoft.Extensions.Http.Resilience.OrderedGroupsRoutingOptions)instance;
                BindCore(configuration, ref temp, defaultValueIfNotFound: false, binderOptions);
                return;
            }
            else if (type == typeof(global::Microsoft.Extensions.Http.Resilience.WeightedGroupsRoutingOptions))
            {
                var temp = (global::Microsoft.Extensions.Http.Resilience.WeightedGroupsRoutingOptions)instance;
                BindCore(configuration, ref temp, defaultValueIfNotFound: false, binderOptions);
                return;
            }
 
            throw new NotSupportedException($"Unable to bind to type '{type}': generator did not detect the type as input.");
        }
 
        public static void BindCore(IConfiguration configuration, ref global::Microsoft.Extensions.Http.Resilience.HttpTimeoutStrategyOptions instance, bool defaultValueIfNotFound, BinderOptions? binderOptions)
        {
            ValidateConfigurationKeys(typeof(global::Microsoft.Extensions.Http.Resilience.HttpTimeoutStrategyOptions), s_configKeys_HttpTimeoutStrategyOptions, configuration, binderOptions);
 
            if (configuration["Timeout"] is string value4)
            {
                instance.Timeout = ParseSystemTimeSpan(value4, () => configuration.GetSection("Timeout").Path);
            }
            else if (defaultValueIfNotFound)
            {
                instance.Timeout = default;
            }
 
            if (configuration["Name"] is string value5)
            {
                instance.Name = value5;
            }
        }
 
        public static void BindCore(IConfiguration configuration, ref global::Microsoft.Extensions.Http.Resilience.HttpHedgingStrategyOptions instance, bool defaultValueIfNotFound, BinderOptions? binderOptions)
        {
            ValidateConfigurationKeys(typeof(global::Microsoft.Extensions.Http.Resilience.HttpHedgingStrategyOptions), s_configKeys_HttpHedgingStrategyOptions, configuration, binderOptions);
 
            if (configuration["Delay"] is string value6)
            {
                instance.Delay = ParseSystemTimeSpan(value6, () => configuration.GetSection("Delay").Path);
            }
            else if (defaultValueIfNotFound)
            {
                instance.Delay = default;
            }
 
            if (configuration["MaxHedgedAttempts"] is string value7)
            {
                instance.MaxHedgedAttempts = ParseInt(value7, () => configuration.GetSection("MaxHedgedAttempts").Path);
            }
            else if (defaultValueIfNotFound)
            {
                instance.MaxHedgedAttempts = default;
            }
 
            if (configuration["Name"] is string value8)
            {
                instance.Name = value8;
            }
        }
 
        public static void BindCore(IConfiguration configuration, ref global::System.Threading.RateLimiting.ConcurrencyLimiterOptions instance, bool defaultValueIfNotFound, BinderOptions? binderOptions)
        {
            ValidateConfigurationKeys(typeof(global::System.Threading.RateLimiting.ConcurrencyLimiterOptions), s_configKeys_ConcurrencyLimiterOptions, configuration, binderOptions);
 
            if (configuration["PermitLimit"] is string value9)
            {
                instance.PermitLimit = ParseInt(value9, () => configuration.GetSection("PermitLimit").Path);
            }
            else if (defaultValueIfNotFound)
            {
                instance.PermitLimit = default;
            }
 
            if (configuration["QueueProcessingOrder"] is string value10)
            {
                instance.QueueProcessingOrder = ParseEnum<global::System.Threading.RateLimiting.QueueProcessingOrder>(value10, () => configuration.GetSection("QueueProcessingOrder").Path);
            }
            else if (defaultValueIfNotFound)
            {
                instance.QueueProcessingOrder = default;
            }
 
            if (configuration["QueueLimit"] is string value11)
            {
                instance.QueueLimit = ParseInt(value11, () => configuration.GetSection("QueueLimit").Path);
            }
            else if (defaultValueIfNotFound)
            {
                instance.QueueLimit = default;
            }
        }
 
        public static void BindCore(IConfiguration configuration, ref global::Microsoft.Extensions.Http.Resilience.HttpRateLimiterStrategyOptions instance, bool defaultValueIfNotFound, BinderOptions? binderOptions)
        {
            ValidateConfigurationKeys(typeof(global::Microsoft.Extensions.Http.Resilience.HttpRateLimiterStrategyOptions), s_configKeys_HttpRateLimiterStrategyOptions, configuration, binderOptions);
 
            if (AsConfigWithChildren(configuration.GetSection("DefaultRateLimiterOptions")) is IConfigurationSection section12)
            {
                global::System.Threading.RateLimiting.ConcurrencyLimiterOptions? temp14 = instance.DefaultRateLimiterOptions;
                temp14 ??= new global::System.Threading.RateLimiting.ConcurrencyLimiterOptions();
                BindCore(section12, ref temp14, defaultValueIfNotFound: false, binderOptions);
                instance.DefaultRateLimiterOptions = temp14;
            }
 
            if (configuration["Name"] is string value15)
            {
                instance.Name = value15;
            }
        }
 
        public static void BindCore(IConfiguration configuration, ref global::Polly.CircuitBreaker.CircuitBreakerStateProvider instance, bool defaultValueIfNotFound, BinderOptions? binderOptions)
        {
            ValidateConfigurationKeys(typeof(global::Polly.CircuitBreaker.CircuitBreakerStateProvider), s_configKeys_CircuitBreakerStateProvider, configuration, binderOptions);
        }
 
        public static void BindCore(IConfiguration configuration, ref global::Microsoft.Extensions.Http.Resilience.HttpCircuitBreakerStrategyOptions instance, bool defaultValueIfNotFound, BinderOptions? binderOptions)
        {
            ValidateConfigurationKeys(typeof(global::Microsoft.Extensions.Http.Resilience.HttpCircuitBreakerStrategyOptions), s_configKeys_HttpCircuitBreakerStrategyOptions, configuration, binderOptions);
 
            if (configuration["FailureRatio"] is string value16)
            {
                instance.FailureRatio = ParseDouble(value16, () => configuration.GetSection("FailureRatio").Path);
            }
            else if (defaultValueIfNotFound)
            {
                instance.FailureRatio = default;
            }
 
            if (configuration["MinimumThroughput"] is string value17)
            {
                instance.MinimumThroughput = ParseInt(value17, () => configuration.GetSection("MinimumThroughput").Path);
            }
            else if (defaultValueIfNotFound)
            {
                instance.MinimumThroughput = default;
            }
 
            if (configuration["SamplingDuration"] is string value18)
            {
                instance.SamplingDuration = ParseSystemTimeSpan(value18, () => configuration.GetSection("SamplingDuration").Path);
            }
            else if (defaultValueIfNotFound)
            {
                instance.SamplingDuration = default;
            }
 
            if (configuration["BreakDuration"] is string value19)
            {
                instance.BreakDuration = ParseSystemTimeSpan(value19, () => configuration.GetSection("BreakDuration").Path);
            }
            else if (defaultValueIfNotFound)
            {
                instance.BreakDuration = default;
            }
 
            if (AsConfigWithChildren(configuration.GetSection("ManualControl")) is IConfigurationSection section20)
            {
                instance.ManualControl ??= new global::Polly.CircuitBreaker.CircuitBreakerManualControl();
            }
 
            if (AsConfigWithChildren(configuration.GetSection("StateProvider")) is IConfigurationSection section22)
            {
                global::Polly.CircuitBreaker.CircuitBreakerStateProvider? temp24 = instance.StateProvider;
                temp24 ??= new global::Polly.CircuitBreaker.CircuitBreakerStateProvider();
                BindCore(section22, ref temp24, defaultValueIfNotFound: false, binderOptions);
                instance.StateProvider = temp24;
            }
 
            if (configuration["Name"] is string value25)
            {
                instance.Name = value25;
            }
        }
 
        public static void BindCore(IConfiguration configuration, ref global::Microsoft.Extensions.Http.Resilience.HedgingEndpointOptions instance, bool defaultValueIfNotFound, BinderOptions? binderOptions)
        {
            ValidateConfigurationKeys(typeof(global::Microsoft.Extensions.Http.Resilience.HedgingEndpointOptions), s_configKeys_HedgingEndpointOptions, configuration, binderOptions);
 
            if (AsConfigWithChildren(configuration.GetSection("RateLimiter")) is IConfigurationSection section26)
            {
                global::Microsoft.Extensions.Http.Resilience.HttpRateLimiterStrategyOptions? temp28 = instance.RateLimiter;
                temp28 ??= new global::Microsoft.Extensions.Http.Resilience.HttpRateLimiterStrategyOptions();
                BindCore(section26, ref temp28, defaultValueIfNotFound: false, binderOptions);
                instance.RateLimiter = temp28;
            }
 
            if (AsConfigWithChildren(configuration.GetSection("CircuitBreaker")) is IConfigurationSection section29)
            {
                global::Microsoft.Extensions.Http.Resilience.HttpCircuitBreakerStrategyOptions? temp31 = instance.CircuitBreaker;
                temp31 ??= new global::Microsoft.Extensions.Http.Resilience.HttpCircuitBreakerStrategyOptions();
                BindCore(section29, ref temp31, defaultValueIfNotFound: false, binderOptions);
                instance.CircuitBreaker = temp31;
            }
 
            if (AsConfigWithChildren(configuration.GetSection("Timeout")) is IConfigurationSection section32)
            {
                global::Microsoft.Extensions.Http.Resilience.HttpTimeoutStrategyOptions? temp34 = instance.Timeout;
                temp34 ??= new global::Microsoft.Extensions.Http.Resilience.HttpTimeoutStrategyOptions();
                BindCore(section32, ref temp34, defaultValueIfNotFound: false, binderOptions);
                instance.Timeout = temp34;
            }
        }
 
        public static void BindCore(IConfiguration configuration, ref global::Microsoft.Extensions.Http.Resilience.HttpStandardHedgingResilienceOptions instance, bool defaultValueIfNotFound, BinderOptions? binderOptions)
        {
            ValidateConfigurationKeys(typeof(global::Microsoft.Extensions.Http.Resilience.HttpStandardHedgingResilienceOptions), s_configKeys_HttpStandardHedgingResilienceOptions, configuration, binderOptions);
 
            if (AsConfigWithChildren(configuration.GetSection("TotalRequestTimeout")) is IConfigurationSection section35)
            {
                global::Microsoft.Extensions.Http.Resilience.HttpTimeoutStrategyOptions? temp37 = instance.TotalRequestTimeout;
                temp37 ??= new global::Microsoft.Extensions.Http.Resilience.HttpTimeoutStrategyOptions();
                BindCore(section35, ref temp37, defaultValueIfNotFound: false, binderOptions);
                instance.TotalRequestTimeout = temp37;
            }
 
            if (AsConfigWithChildren(configuration.GetSection("Hedging")) is IConfigurationSection section38)
            {
                global::Microsoft.Extensions.Http.Resilience.HttpHedgingStrategyOptions? temp40 = instance.Hedging;
                temp40 ??= new global::Microsoft.Extensions.Http.Resilience.HttpHedgingStrategyOptions();
                BindCore(section38, ref temp40, defaultValueIfNotFound: false, binderOptions);
                instance.Hedging = temp40;
            }
 
            if (AsConfigWithChildren(configuration.GetSection("Endpoint")) is IConfigurationSection section41)
            {
                global::Microsoft.Extensions.Http.Resilience.HedgingEndpointOptions? temp43 = instance.Endpoint;
                temp43 ??= new global::Microsoft.Extensions.Http.Resilience.HedgingEndpointOptions();
                BindCore(section41, ref temp43, defaultValueIfNotFound: false, binderOptions);
                instance.Endpoint = temp43;
            }
        }
 
        public static void BindCore(IConfiguration configuration, ref global::Microsoft.Extensions.Http.Resilience.HttpRetryStrategyOptions instance, bool defaultValueIfNotFound, BinderOptions? binderOptions)
        {
            ValidateConfigurationKeys(typeof(global::Microsoft.Extensions.Http.Resilience.HttpRetryStrategyOptions), s_configKeys_HttpRetryStrategyOptions, configuration, binderOptions);
 
            if (configuration["ShouldRetryAfterHeader"] is string value44)
            {
                instance.ShouldRetryAfterHeader = ParseBool(value44, () => configuration.GetSection("ShouldRetryAfterHeader").Path);
            }
            else if (defaultValueIfNotFound)
            {
                instance.ShouldRetryAfterHeader = default;
            }
 
            if (configuration["MaxRetryAttempts"] is string value45)
            {
                instance.MaxRetryAttempts = ParseInt(value45, () => configuration.GetSection("MaxRetryAttempts").Path);
            }
            else if (defaultValueIfNotFound)
            {
                instance.MaxRetryAttempts = default;
            }
 
            if (configuration["BackoffType"] is string value46)
            {
                instance.BackoffType = ParseEnum<global::Polly.DelayBackoffType>(value46, () => configuration.GetSection("BackoffType").Path);
            }
            else if (defaultValueIfNotFound)
            {
                instance.BackoffType = default;
            }
 
            if (configuration["UseJitter"] is string value47)
            {
                instance.UseJitter = ParseBool(value47, () => configuration.GetSection("UseJitter").Path);
            }
            else if (defaultValueIfNotFound)
            {
                instance.UseJitter = default;
            }
 
            if (configuration["Delay"] is string value48)
            {
                instance.Delay = ParseSystemTimeSpan(value48, () => configuration.GetSection("Delay").Path);
            }
            else if (defaultValueIfNotFound)
            {
                instance.Delay = default;
            }
 
            if (configuration["MaxDelay"] is string value49)
            {
                instance.MaxDelay = ParseSystemTimeSpan(value49, () => configuration.GetSection("MaxDelay").Path);
            }
 
            if (configuration["Name"] is string value50)
            {
                instance.Name = value50;
            }
        }
 
        public static void BindCore(IConfiguration configuration, ref global::Microsoft.Extensions.Http.Resilience.HttpStandardResilienceOptions instance, bool defaultValueIfNotFound, BinderOptions? binderOptions)
        {
            ValidateConfigurationKeys(typeof(global::Microsoft.Extensions.Http.Resilience.HttpStandardResilienceOptions), s_configKeys_HttpStandardResilienceOptions, configuration, binderOptions);
 
            if (AsConfigWithChildren(configuration.GetSection("RateLimiter")) is IConfigurationSection section51)
            {
                global::Microsoft.Extensions.Http.Resilience.HttpRateLimiterStrategyOptions? temp53 = instance.RateLimiter;
                temp53 ??= new global::Microsoft.Extensions.Http.Resilience.HttpRateLimiterStrategyOptions();
                BindCore(section51, ref temp53, defaultValueIfNotFound: false, binderOptions);
                instance.RateLimiter = temp53;
            }
 
            if (AsConfigWithChildren(configuration.GetSection("TotalRequestTimeout")) is IConfigurationSection section54)
            {
                global::Microsoft.Extensions.Http.Resilience.HttpTimeoutStrategyOptions? temp56 = instance.TotalRequestTimeout;
                temp56 ??= new global::Microsoft.Extensions.Http.Resilience.HttpTimeoutStrategyOptions();
                BindCore(section54, ref temp56, defaultValueIfNotFound: false, binderOptions);
                instance.TotalRequestTimeout = temp56;
            }
 
            if (AsConfigWithChildren(configuration.GetSection("Retry")) is IConfigurationSection section57)
            {
                global::Microsoft.Extensions.Http.Resilience.HttpRetryStrategyOptions? temp59 = instance.Retry;
                temp59 ??= new global::Microsoft.Extensions.Http.Resilience.HttpRetryStrategyOptions();
                BindCore(section57, ref temp59, defaultValueIfNotFound: false, binderOptions);
                instance.Retry = temp59;
            }
 
            if (AsConfigWithChildren(configuration.GetSection("CircuitBreaker")) is IConfigurationSection section60)
            {
                global::Microsoft.Extensions.Http.Resilience.HttpCircuitBreakerStrategyOptions? temp62 = instance.CircuitBreaker;
                temp62 ??= new global::Microsoft.Extensions.Http.Resilience.HttpCircuitBreakerStrategyOptions();
                BindCore(section60, ref temp62, defaultValueIfNotFound: false, binderOptions);
                instance.CircuitBreaker = temp62;
            }
 
            if (AsConfigWithChildren(configuration.GetSection("AttemptTimeout")) is IConfigurationSection section63)
            {
                global::Microsoft.Extensions.Http.Resilience.HttpTimeoutStrategyOptions? temp65 = instance.AttemptTimeout;
                temp65 ??= new global::Microsoft.Extensions.Http.Resilience.HttpTimeoutStrategyOptions();
                BindCore(section63, ref temp65, defaultValueIfNotFound: false, binderOptions);
                instance.AttemptTimeout = temp65;
            }
        }
 
        public static void BindCore(IConfiguration configuration, ref global::Microsoft.Extensions.Http.Resilience.WeightedUriEndpoint instance, bool defaultValueIfNotFound, BinderOptions? binderOptions)
        {
            ValidateConfigurationKeys(typeof(global::Microsoft.Extensions.Http.Resilience.WeightedUriEndpoint), s_configKeys_WeightedUriEndpoint, configuration, binderOptions);
 
            if (configuration["Uri"] is string value66)
            {
                instance.Uri = ParseSystemUri(value66, () => configuration.GetSection("Uri").Path);
            }
 
            if (configuration["Weight"] is string value67)
            {
                instance.Weight = ParseInt(value67, () => configuration.GetSection("Weight").Path);
            }
            else if (defaultValueIfNotFound)
            {
                instance.Weight = default;
            }
        }
 
        public static void BindCore(IConfiguration configuration, ref global::System.Collections.Generic.IList<global::Microsoft.Extensions.Http.Resilience.WeightedUriEndpoint> instance, bool defaultValueIfNotFound, BinderOptions? binderOptions)
        {
            foreach (IConfigurationSection section in configuration.GetChildren())
            {
                var value = new global::Microsoft.Extensions.Http.Resilience.WeightedUriEndpoint();
                BindCore(section, ref value, defaultValueIfNotFound: false, binderOptions);
                instance.Add(value);
            }
        }
 
        public static void BindCore(IConfiguration configuration, ref global::Microsoft.Extensions.Http.Resilience.UriEndpointGroup instance, bool defaultValueIfNotFound, BinderOptions? binderOptions)
        {
            ValidateConfigurationKeys(typeof(global::Microsoft.Extensions.Http.Resilience.UriEndpointGroup), s_configKeys_UriEndpointGroup, configuration, binderOptions);
 
            if (AsConfigWithChildren(configuration.GetSection("Endpoints")) is IConfigurationSection section69)
            {
                global::System.Collections.Generic.IList<global::Microsoft.Extensions.Http.Resilience.WeightedUriEndpoint>? temp71 = instance.Endpoints;
                temp71 ??= (global::System.Collections.Generic.IList<global::Microsoft.Extensions.Http.Resilience.WeightedUriEndpoint>)new List<global::Microsoft.Extensions.Http.Resilience.WeightedUriEndpoint>();
                BindCore(section69, ref temp71, defaultValueIfNotFound: false, binderOptions);
                instance.Endpoints = temp71;
            }
        }
 
        public static void BindCore(IConfiguration configuration, ref global::System.Collections.Generic.IList<global::Microsoft.Extensions.Http.Resilience.UriEndpointGroup> instance, bool defaultValueIfNotFound, BinderOptions? binderOptions)
        {
            foreach (IConfigurationSection section in configuration.GetChildren())
            {
                var value = new global::Microsoft.Extensions.Http.Resilience.UriEndpointGroup();
                BindCore(section, ref value, defaultValueIfNotFound: false, binderOptions);
                instance.Add(value);
            }
        }
 
        public static void BindCore(IConfiguration configuration, ref global::Microsoft.Extensions.Http.Resilience.OrderedGroupsRoutingOptions instance, bool defaultValueIfNotFound, BinderOptions? binderOptions)
        {
            ValidateConfigurationKeys(typeof(global::Microsoft.Extensions.Http.Resilience.OrderedGroupsRoutingOptions), s_configKeys_OrderedGroupsRoutingOptions, configuration, binderOptions);
 
            if (AsConfigWithChildren(configuration.GetSection("Groups")) is IConfigurationSection section73)
            {
                global::System.Collections.Generic.IList<global::Microsoft.Extensions.Http.Resilience.UriEndpointGroup>? temp75 = instance.Groups;
                temp75 ??= (global::System.Collections.Generic.IList<global::Microsoft.Extensions.Http.Resilience.UriEndpointGroup>)new List<global::Microsoft.Extensions.Http.Resilience.UriEndpointGroup>();
                BindCore(section73, ref temp75, defaultValueIfNotFound: false, binderOptions);
                instance.Groups = temp75;
            }
        }
 
        public static void BindCore(IConfiguration configuration, ref global::Microsoft.Extensions.Http.Resilience.WeightedUriEndpointGroup instance, bool defaultValueIfNotFound, BinderOptions? binderOptions)
        {
            ValidateConfigurationKeys(typeof(global::Microsoft.Extensions.Http.Resilience.WeightedUriEndpointGroup), s_configKeys_WeightedUriEndpointGroup, configuration, binderOptions);
 
            if (configuration["Weight"] is string value76)
            {
                instance.Weight = ParseInt(value76, () => configuration.GetSection("Weight").Path);
            }
            else if (defaultValueIfNotFound)
            {
                instance.Weight = default;
            }
 
            if (AsConfigWithChildren(configuration.GetSection("Endpoints")) is IConfigurationSection section77)
            {
                global::System.Collections.Generic.IList<global::Microsoft.Extensions.Http.Resilience.WeightedUriEndpoint>? temp79 = instance.Endpoints;
                temp79 ??= (global::System.Collections.Generic.IList<global::Microsoft.Extensions.Http.Resilience.WeightedUriEndpoint>)new List<global::Microsoft.Extensions.Http.Resilience.WeightedUriEndpoint>();
                BindCore(section77, ref temp79, defaultValueIfNotFound: false, binderOptions);
                instance.Endpoints = temp79;
            }
        }
 
        public static void BindCore(IConfiguration configuration, ref global::System.Collections.Generic.IList<global::Microsoft.Extensions.Http.Resilience.WeightedUriEndpointGroup> instance, bool defaultValueIfNotFound, BinderOptions? binderOptions)
        {
            foreach (IConfigurationSection section in configuration.GetChildren())
            {
                var value = new global::Microsoft.Extensions.Http.Resilience.WeightedUriEndpointGroup();
                BindCore(section, ref value, defaultValueIfNotFound: false, binderOptions);
                instance.Add(value);
            }
        }
 
        public static void BindCore(IConfiguration configuration, ref global::Microsoft.Extensions.Http.Resilience.WeightedGroupsRoutingOptions instance, bool defaultValueIfNotFound, BinderOptions? binderOptions)
        {
            ValidateConfigurationKeys(typeof(global::Microsoft.Extensions.Http.Resilience.WeightedGroupsRoutingOptions), s_configKeys_WeightedGroupsRoutingOptions, configuration, binderOptions);
 
            if (configuration["SelectionMode"] is string value81)
            {
                instance.SelectionMode = ParseEnum<global::Microsoft.Extensions.Http.Resilience.WeightedGroupSelectionMode>(value81, () => configuration.GetSection("SelectionMode").Path);
            }
            else if (defaultValueIfNotFound)
            {
                instance.SelectionMode = default;
            }
 
            if (AsConfigWithChildren(configuration.GetSection("Groups")) is IConfigurationSection section82)
            {
                global::System.Collections.Generic.IList<global::Microsoft.Extensions.Http.Resilience.WeightedUriEndpointGroup>? temp84 = instance.Groups;
                temp84 ??= (global::System.Collections.Generic.IList<global::Microsoft.Extensions.Http.Resilience.WeightedUriEndpointGroup>)new List<global::Microsoft.Extensions.Http.Resilience.WeightedUriEndpointGroup>();
                BindCore(section82, ref temp84, defaultValueIfNotFound: false, binderOptions);
                instance.Groups = temp84;
            }
        }
 
 
        /// <summary>If required by the binder options, validates that there are no unknown keys in the input configuration object.</summary>
        public static void ValidateConfigurationKeys(Type type, Lazy<HashSet<string>> keys, IConfiguration configuration, BinderOptions? binderOptions)
        {
            if (binderOptions?.ErrorOnUnknownConfiguration is true)
            {
                List<string>? temp = null;
        
                foreach (IConfigurationSection section in configuration.GetChildren())
                {
                    if (!keys.Value.Contains(section.Key))
                    {
                        (temp ??= new List<string>()).Add($"'{section.Key}'");
                    }
                }
        
                if (temp is not null)
                {
                    throw new InvalidOperationException($"'ErrorOnUnknownConfiguration' was set on the provided BinderOptions, but the following properties were not found on the instance of {type}: {string.Join(", ", temp)}");
                }
            }
        }
 
        public static bool HasValueOrChildren(IConfiguration configuration)
        {
            if ((configuration as IConfigurationSection)?.Value is not null)
            {
                return true;
            }
            return AsConfigWithChildren(configuration) is not null;
        }
 
        public static IConfiguration? AsConfigWithChildren(IConfiguration configuration)
        {
            foreach (IConfigurationSection _ in configuration.GetChildren())
            {
                return configuration;
            }
            return null;
        }
 
        public static BinderOptions? GetBinderOptions(Action<BinderOptions>? configureOptions)
        {
            if (configureOptions is null)
            {
                return null;
            }
        
            BinderOptions binderOptions = new();
            configureOptions(binderOptions);
        
            if (binderOptions.BindNonPublicProperties)
            {
                throw new NotSupportedException($"The configuration binding source generator does not support 'BinderOptions.BindNonPublicProperties'.");
            }
        
            return binderOptions;
        }
 
        public static global::System.TimeSpan ParseSystemTimeSpan(string value, Func<string?> getPath)
        {
            try
            {
                return global::System.TimeSpan.Parse(value, CultureInfo.InvariantCulture);
            }
            catch (Exception exception)
            {
                throw new InvalidOperationException($"Failed to convert configuration value at '{getPath()}' to type '{typeof(global::System.TimeSpan)}'.", exception);
            }
        }
 
        public static int ParseInt(string value, Func<string?> getPath)
        {
            try
            {
                return int.Parse(value, NumberStyles.Integer, CultureInfo.InvariantCulture);
            }
            catch (Exception exception)
            {
                throw new InvalidOperationException($"Failed to convert configuration value at '{getPath()}' to type '{typeof(int)}'.", exception);
            }
        }
 
        public static T ParseEnum<T>(string value, Func<string?> getPath) where T : struct
        {
            try
            {
                #if NETFRAMEWORK || NETSTANDARD2_0
                    return (T)Enum.Parse(typeof(T), value, ignoreCase: true);
                #else
                    return Enum.Parse<T>(value, ignoreCase: true);
                #endif
            }
            catch (Exception exception)
            {
                throw new InvalidOperationException($"Failed to convert configuration value at '{getPath()}' to type '{typeof(T)}'.", exception);
            }
        }
 
        public static double ParseDouble(string value, Func<string?> getPath)
        {
            try
            {
                return double.Parse(value, NumberStyles.Float, CultureInfo.InvariantCulture);
            }
            catch (Exception exception)
            {
                throw new InvalidOperationException($"Failed to convert configuration value at '{getPath()}' to type '{typeof(double)}'.", exception);
            }
        }
 
 
        public static bool ParseBool(string value, Func<string?> getPath)
        {
            try
            {
                return bool.Parse(value);
            }
            catch (Exception exception)
            {
                throw new InvalidOperationException($"Failed to convert configuration value at '{getPath()}' to type '{typeof(bool)}'.", exception);
            }
        }
 
 
        public static global::System.Uri ParseSystemUri(string value, Func<string?> getPath)
        {
            try
            {
                return new Uri(value, UriKind.RelativeOrAbsolute);
            }
            catch (Exception exception)
            {
                throw new InvalidOperationException($"Failed to convert configuration value at '{getPath()}' to type '{typeof(global::System.Uri)}'.", exception);
            }
        }
 
        #endregion Core binding extensions.
    }
}