using Microsoft.Extensions.Configuration; using NetEscapades.Configuration.Yaml; using System; namespace StellaOps.Configuration; public static partial class StellaOpsConfigurationBootstrapper { public static StellaOpsConfigurationContext Build( Action>? configure = null) where TOptions : class, new() { var bootstrapOptions = new StellaOpsBootstrapOptions(); configure?.Invoke(bootstrapOptions); var configurationOptions = bootstrapOptions.ConfigurationOptions; var builder = new ConfigurationBuilder(); if (!string.IsNullOrWhiteSpace(configurationOptions.BasePath)) { builder.SetBasePath(configurationOptions.BasePath!); } if (configurationOptions.IncludeJsonFiles) { foreach (var file in configurationOptions.JsonFiles) { builder.AddJsonFile(file.Path, optional: file.Optional, reloadOnChange: file.ReloadOnChange); } } if (configurationOptions.IncludeYamlFiles) { foreach (var file in configurationOptions.YamlFiles) { builder.AddYamlFile(file.Path, optional: file.Optional); } } configurationOptions.ConfigureBuilder?.Invoke(builder); if (configurationOptions.IncludeEnvironmentVariables) { builder.AddEnvironmentVariables(configurationOptions.EnvironmentPrefix); } var configuration = builder.Build(); IConfiguration bindingSource; if (string.IsNullOrWhiteSpace(configurationOptions.BindingSection)) { bindingSource = configuration; } else { bindingSource = configuration.GetSection(configurationOptions.BindingSection!); } var options = new TOptions(); bindingSource.Bind(options); bootstrapOptions.PostBind?.Invoke(options, configuration); return new StellaOpsConfigurationContext(configuration, options); } }