File: Generated\Basic.CompilerLog.Util\Basic.CompilerLog.Util.Impl.BasicGeneratedFilesAnalyzerReference\BindingExtensions.g.cs
Project: ..\..\..\src\Libraries\Microsoft.Extensions.Telemetry\Microsoft.Extensions.Telemetry.csproj (Microsoft.Extensions.Telemetry)
// <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 IConfiguration extensions.
        /// <summary>Attempts to bind the configuration instance to a new instance of type T.</summary>
        [InterceptsLocation(@"/_/src/Libraries/Microsoft.Extensions.Telemetry/Sampling/RandomProbabilisticSamplerConfigureOptions.cs", 32, 68)]
        public static T? Get<T>(this IConfiguration configuration) => (T?)(GetCore(configuration, typeof(T), configureOptions: null) ?? default(T));
        #endregion IConfiguration extensions.
 
        #region OptionsBuilder<TOptions> extensions.
        /// <summary>Registers a configuration instance which <typeparamref name="TOptions"/> will bind against.</summary>
        [InterceptsLocation(@"/_/src/Libraries/Microsoft.Extensions.Telemetry/Logging/LoggingEnrichmentExtensions.cs", 58, 105)]
        [InterceptsLocation(@"/_/src/Libraries/Microsoft.Extensions.Telemetry/Logging/LoggingRedactionExtensions.cs", 56, 55)]
        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.Telemetry/Enrichment/ApplicationEnricherServiceCollectionExtensions.cs", 103, 14)]
        [InterceptsLocation(@"/_/src/Libraries/Microsoft.Extensions.Telemetry/Enrichment/ProcessEnricherServiceCollectionExtensions.cs", 63, 14)]
        [InterceptsLocation(@"/_/src/Libraries/Microsoft.Extensions.Telemetry/Latency/LatencyConsoleExtensions.cs", 63, 22)]
        [InterceptsLocation(@"/_/src/Libraries/Microsoft.Extensions.Telemetry/Latency/LatencyContextExtensions.cs", 61, 22)]
        public static IServiceCollection Configure<TOptions>(this IServiceCollection services, IConfiguration config) where TOptions : class
        {
            return Configure<TOptions>(services, string.Empty, config, configureOptions: null);
        }
 
        /// <summary>Registers a configuration instance which TOptions will bind against.</summary>
        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_ApplicationLogEnricherOptions = new(() => new HashSet<string>(StringComparer.OrdinalIgnoreCase) { "EnvironmentName", "ApplicationName", "DeploymentRing", "BuildVersion" });
        private readonly static Lazy<HashSet<string>> s_configKeys_ProcessLogEnricherOptions = new(() => new HashSet<string>(StringComparer.OrdinalIgnoreCase) { "ProcessId", "ThreadId" });
        private readonly static Lazy<HashSet<string>> s_configKeys_LatencyConsoleOptions = new(() => new HashSet<string>(StringComparer.OrdinalIgnoreCase) { "OutputCheckpoints", "OutputTags", "OutputMeasures" });
        private readonly static Lazy<HashSet<string>> s_configKeys_LatencyContextOptions = new(() => new HashSet<string>(StringComparer.OrdinalIgnoreCase) { "ThrowOnUnregisteredNames" });
        private readonly static Lazy<HashSet<string>> s_configKeys_LoggerEnrichmentOptions = new(() => new HashSet<string>(StringComparer.OrdinalIgnoreCase) { "CaptureStackTraces", "UseFileInfoForStackTraces", "IncludeExceptionMessage", "MaxStackTraceLength" });
        private readonly static Lazy<HashSet<string>> s_configKeys_LoggerRedactionOptions = new(() => new HashSet<string>(StringComparer.OrdinalIgnoreCase) { "ApplyDiscriminator" });
        private readonly static Lazy<HashSet<string>> s_configKeys_RandomProbabilisticSamplerFilterRule = new(() => new HashSet<string>(StringComparer.OrdinalIgnoreCase) { "Probability", "CategoryName", "LogLevel", "EventId", "EventName" });
        private readonly static Lazy<HashSet<string>> s_configKeys_RandomProbabilisticSamplerOptions = new(() => new HashSet<string>(StringComparer.OrdinalIgnoreCase) { "Rules" });
 
        public static object? GetCore(this IConfiguration configuration, Type type, Action<BinderOptions>? configureOptions)
        {
            if (configuration is null)
            {
                throw new ArgumentNullException(nameof(configuration));
            }
 
            BinderOptions? binderOptions = GetBinderOptions(configureOptions);
 
            if (!HasValueOrChildren(configuration))
            {
                return null;
            }
 
            if (type == typeof(global::Microsoft.Extensions.Diagnostics.Sampling.RandomProbabilisticSamplerOptions))
            {
                var instance = new global::Microsoft.Extensions.Diagnostics.Sampling.RandomProbabilisticSamplerOptions();
                BindCore(configuration, ref instance, defaultValueIfNotFound: true, binderOptions);
                return instance;
            }
 
            throw new NotSupportedException($"Unable to bind to type '{type}': generator did not detect the type as input.");
        }
 
        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.Diagnostics.Enrichment.ApplicationLogEnricherOptions))
            {
                var temp = (global::Microsoft.Extensions.Diagnostics.Enrichment.ApplicationLogEnricherOptions)instance;
                BindCore(configuration, ref temp, defaultValueIfNotFound: false, binderOptions);
                return;
            }
            else if (type == typeof(global::Microsoft.Extensions.Diagnostics.Enrichment.ProcessLogEnricherOptions))
            {
                var temp = (global::Microsoft.Extensions.Diagnostics.Enrichment.ProcessLogEnricherOptions)instance;
                BindCore(configuration, ref temp, defaultValueIfNotFound: false, binderOptions);
                return;
            }
            else if (type == typeof(global::Microsoft.Extensions.Diagnostics.Latency.LatencyConsoleOptions))
            {
                var temp = (global::Microsoft.Extensions.Diagnostics.Latency.LatencyConsoleOptions)instance;
                BindCore(configuration, ref temp, defaultValueIfNotFound: false, binderOptions);
                return;
            }
            else if (type == typeof(global::Microsoft.Extensions.Diagnostics.Latency.LatencyContextOptions))
            {
                var temp = (global::Microsoft.Extensions.Diagnostics.Latency.LatencyContextOptions)instance;
                BindCore(configuration, ref temp, defaultValueIfNotFound: false, binderOptions);
                return;
            }
            else if (type == typeof(global::Microsoft.Extensions.Logging.LoggerEnrichmentOptions))
            {
                var temp = (global::Microsoft.Extensions.Logging.LoggerEnrichmentOptions)instance;
                BindCore(configuration, ref temp, defaultValueIfNotFound: false, binderOptions);
                return;
            }
            else if (type == typeof(global::Microsoft.Extensions.Logging.LoggerRedactionOptions))
            {
                var temp = (global::Microsoft.Extensions.Logging.LoggerRedactionOptions)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.Diagnostics.Enrichment.ApplicationLogEnricherOptions instance, bool defaultValueIfNotFound, BinderOptions? binderOptions)
        {
            ValidateConfigurationKeys(typeof(global::Microsoft.Extensions.Diagnostics.Enrichment.ApplicationLogEnricherOptions), s_configKeys_ApplicationLogEnricherOptions, configuration, binderOptions);
 
            if (configuration["EnvironmentName"] is string value7)
            {
                instance.EnvironmentName = ParseBool(value7, () => configuration.GetSection("EnvironmentName").Path);
            }
            else if (defaultValueIfNotFound)
            {
                instance.EnvironmentName = default;
            }
 
            if (configuration["ApplicationName"] is string value8)
            {
                instance.ApplicationName = ParseBool(value8, () => configuration.GetSection("ApplicationName").Path);
            }
            else if (defaultValueIfNotFound)
            {
                instance.ApplicationName = default;
            }
 
            if (configuration["DeploymentRing"] is string value9)
            {
                instance.DeploymentRing = ParseBool(value9, () => configuration.GetSection("DeploymentRing").Path);
            }
            else if (defaultValueIfNotFound)
            {
                instance.DeploymentRing = default;
            }
 
            if (configuration["BuildVersion"] is string value10)
            {
                instance.BuildVersion = ParseBool(value10, () => configuration.GetSection("BuildVersion").Path);
            }
            else if (defaultValueIfNotFound)
            {
                instance.BuildVersion = default;
            }
        }
 
        public static void BindCore(IConfiguration configuration, ref global::Microsoft.Extensions.Diagnostics.Enrichment.ProcessLogEnricherOptions instance, bool defaultValueIfNotFound, BinderOptions? binderOptions)
        {
            ValidateConfigurationKeys(typeof(global::Microsoft.Extensions.Diagnostics.Enrichment.ProcessLogEnricherOptions), s_configKeys_ProcessLogEnricherOptions, configuration, binderOptions);
 
            if (configuration["ProcessId"] is string value11)
            {
                instance.ProcessId = ParseBool(value11, () => configuration.GetSection("ProcessId").Path);
            }
            else if (defaultValueIfNotFound)
            {
                instance.ProcessId = default;
            }
 
            if (configuration["ThreadId"] is string value12)
            {
                instance.ThreadId = ParseBool(value12, () => configuration.GetSection("ThreadId").Path);
            }
            else if (defaultValueIfNotFound)
            {
                instance.ThreadId = default;
            }
        }
 
        public static void BindCore(IConfiguration configuration, ref global::Microsoft.Extensions.Diagnostics.Latency.LatencyConsoleOptions instance, bool defaultValueIfNotFound, BinderOptions? binderOptions)
        {
            ValidateConfigurationKeys(typeof(global::Microsoft.Extensions.Diagnostics.Latency.LatencyConsoleOptions), s_configKeys_LatencyConsoleOptions, configuration, binderOptions);
 
            if (configuration["OutputCheckpoints"] is string value13)
            {
                instance.OutputCheckpoints = ParseBool(value13, () => configuration.GetSection("OutputCheckpoints").Path);
            }
            else if (defaultValueIfNotFound)
            {
                instance.OutputCheckpoints = default;
            }
 
            if (configuration["OutputTags"] is string value14)
            {
                instance.OutputTags = ParseBool(value14, () => configuration.GetSection("OutputTags").Path);
            }
            else if (defaultValueIfNotFound)
            {
                instance.OutputTags = default;
            }
 
            if (configuration["OutputMeasures"] is string value15)
            {
                instance.OutputMeasures = ParseBool(value15, () => configuration.GetSection("OutputMeasures").Path);
            }
            else if (defaultValueIfNotFound)
            {
                instance.OutputMeasures = default;
            }
        }
 
        public static void BindCore(IConfiguration configuration, ref global::Microsoft.Extensions.Diagnostics.Latency.LatencyContextOptions instance, bool defaultValueIfNotFound, BinderOptions? binderOptions)
        {
            ValidateConfigurationKeys(typeof(global::Microsoft.Extensions.Diagnostics.Latency.LatencyContextOptions), s_configKeys_LatencyContextOptions, configuration, binderOptions);
 
            if (configuration["ThrowOnUnregisteredNames"] is string value16)
            {
                instance.ThrowOnUnregisteredNames = ParseBool(value16, () => configuration.GetSection("ThrowOnUnregisteredNames").Path);
            }
            else if (defaultValueIfNotFound)
            {
                instance.ThrowOnUnregisteredNames = default;
            }
        }
 
        public static void BindCore(IConfiguration configuration, ref global::Microsoft.Extensions.Logging.LoggerEnrichmentOptions instance, bool defaultValueIfNotFound, BinderOptions? binderOptions)
        {
            ValidateConfigurationKeys(typeof(global::Microsoft.Extensions.Logging.LoggerEnrichmentOptions), s_configKeys_LoggerEnrichmentOptions, configuration, binderOptions);
 
            if (configuration["CaptureStackTraces"] is string value17)
            {
                instance.CaptureStackTraces = ParseBool(value17, () => configuration.GetSection("CaptureStackTraces").Path);
            }
            else if (defaultValueIfNotFound)
            {
                instance.CaptureStackTraces = default;
            }
 
            if (configuration["UseFileInfoForStackTraces"] is string value18)
            {
                instance.UseFileInfoForStackTraces = ParseBool(value18, () => configuration.GetSection("UseFileInfoForStackTraces").Path);
            }
            else if (defaultValueIfNotFound)
            {
                instance.UseFileInfoForStackTraces = default;
            }
 
            if (configuration["IncludeExceptionMessage"] is string value19)
            {
                instance.IncludeExceptionMessage = ParseBool(value19, () => configuration.GetSection("IncludeExceptionMessage").Path);
            }
            else if (defaultValueIfNotFound)
            {
                instance.IncludeExceptionMessage = default;
            }
 
            if (configuration["MaxStackTraceLength"] is string value20)
            {
                instance.MaxStackTraceLength = ParseInt(value20, () => configuration.GetSection("MaxStackTraceLength").Path);
            }
            else if (defaultValueIfNotFound)
            {
                instance.MaxStackTraceLength = default;
            }
        }
 
        public static void BindCore(IConfiguration configuration, ref global::Microsoft.Extensions.Logging.LoggerRedactionOptions instance, bool defaultValueIfNotFound, BinderOptions? binderOptions)
        {
            ValidateConfigurationKeys(typeof(global::Microsoft.Extensions.Logging.LoggerRedactionOptions), s_configKeys_LoggerRedactionOptions, configuration, binderOptions);
 
            if (configuration["ApplyDiscriminator"] is string value21)
            {
                instance.ApplyDiscriminator = ParseBool(value21, () => configuration.GetSection("ApplyDiscriminator").Path);
            }
            else if (defaultValueIfNotFound)
            {
                instance.ApplyDiscriminator = default;
            }
        }
 
        public static void BindCore(IConfiguration configuration, ref global::Microsoft.Extensions.Diagnostics.Sampling.RandomProbabilisticSamplerFilterRule instance, bool defaultValueIfNotFound, BinderOptions? binderOptions)
        {
            ValidateConfigurationKeys(typeof(global::Microsoft.Extensions.Diagnostics.Sampling.RandomProbabilisticSamplerFilterRule), s_configKeys_RandomProbabilisticSamplerFilterRule, configuration, binderOptions);
        }
 
        public static void BindCore(IConfiguration configuration, ref global::System.Collections.Generic.IList<global::Microsoft.Extensions.Diagnostics.Sampling.RandomProbabilisticSamplerFilterRule> instance, bool defaultValueIfNotFound, BinderOptions? binderOptions)
        {
            foreach (IConfigurationSection section in configuration.GetChildren())
            {
                var value = InitializeRandomProbabilisticSamplerFilterRule(section, binderOptions);
                BindCore(section, ref value, defaultValueIfNotFound: false, binderOptions);
                instance.Add(value);
            }
        }
 
        public static void BindCore(IConfiguration configuration, ref global::Microsoft.Extensions.Diagnostics.Sampling.RandomProbabilisticSamplerOptions instance, bool defaultValueIfNotFound, BinderOptions? binderOptions)
        {
            ValidateConfigurationKeys(typeof(global::Microsoft.Extensions.Diagnostics.Sampling.RandomProbabilisticSamplerOptions), s_configKeys_RandomProbabilisticSamplerOptions, configuration, binderOptions);
 
            if (AsConfigWithChildren(configuration.GetSection("Rules")) is IConfigurationSection section23)
            {
                global::System.Collections.Generic.IList<global::Microsoft.Extensions.Diagnostics.Sampling.RandomProbabilisticSamplerFilterRule>? temp25 = instance.Rules;
                temp25 ??= (global::System.Collections.Generic.IList<global::Microsoft.Extensions.Diagnostics.Sampling.RandomProbabilisticSamplerFilterRule>)new List<global::Microsoft.Extensions.Diagnostics.Sampling.RandomProbabilisticSamplerFilterRule>();
                BindCore(section23, ref temp25, defaultValueIfNotFound: false, binderOptions);
                instance.Rules = temp25;
            }
        }
 
        public static global::Microsoft.Extensions.Diagnostics.Sampling.RandomProbabilisticSamplerFilterRule InitializeRandomProbabilisticSamplerFilterRule(IConfiguration configuration, BinderOptions? binderOptions)
        {
            double probability = default;
            if (configuration["Probability"] is string value26)
            {
                probability = ParseDouble(value26, () => configuration.GetSection("Probability").Path);
            }
            else
            {
                throw new InvalidOperationException("Cannot create instance of type 'Microsoft.Extensions.Diagnostics.Sampling.RandomProbabilisticSamplerFilterRule' because parameter 'probability' has no matching config. Each parameter in the constructor that does not have a default value must have a corresponding config entry.");
            }
 
            string categoryName = default(string)!;
            if (configuration["CategoryName"] is string value27)
            {
                categoryName = value27;
            }
 
            global::Microsoft.Extensions.Logging.LogLevel? logLevel = default(global::Microsoft.Extensions.Logging.LogLevel?);
            if (configuration["LogLevel"] is string value28)
            {
                logLevel = ParseEnum<global::Microsoft.Extensions.Logging.LogLevel>(value28, () => configuration.GetSection("LogLevel").Path);
            }
 
            int? eventId = default(int?);
            if (configuration["EventId"] is string value29)
            {
                eventId = ParseInt(value29, () => configuration.GetSection("EventId").Path);
            }
 
            string eventName = default(string)!;
            if (configuration["EventName"] is string value30)
            {
                eventName = value30;
            }
 
            return new global::Microsoft.Extensions.Diagnostics.Sampling.RandomProbabilisticSamplerFilterRule(probability, categoryName, logLevel, eventId, eventName);
        }
 
 
        /// <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 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 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 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 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);
            }
        }
        #endregion Core binding extensions.
    }
}