using System.Text.Json; using System.Text.Json.Serialization; using View_by_Distance.Shared.Models; namespace File_Watcher.Models; public record AppSettings(CamstarOracleConfiguration CamstarOracleConfiguration, CompassConfiguration CompassConfiguration, DeterministicHashCodeConfiguration DeterministicHashCodeConfiguration, DriveConfiguration DriveConfiguration, EAFLogConfiguration EAFLogConfiguration, EDADatabaseConfiguration EDADatabaseConfiguration, FileWatcherConfiguration FileWatcherConfiguration, InfinityQSConfiguration InfinityQSConfiguration, IsoConfiguration IsoConfiguration, MetadataSettings MetadataSettings, MetrologyConfiguration MetrologyConfiguration, NugetConfiguration NugetConfiguration, ResultSettings ResultSettings, SerialConfiguration SerialConfiguration, StratusConfiguration StratusConfiguration, TransmissionControlProtocolConfiguration TransmissionControlProtocolConfiguration, WaferCounterConfiguration WaferCounterConfiguration) { public static AppSettings Get(IConfigurationRoot configurationRoot) { AppSettings result; #pragma warning disable IL3050, IL2026 CamstarOracleConfiguration? camstarOracleConfiguration = configurationRoot.GetSection(nameof(CamstarOracleConfiguration)).Get(); CompassConfiguration? compassConfiguration = configurationRoot.GetSection(nameof(CompassConfiguration)).Get(); DeterministicHashCodeConfiguration? deterministicHashCodeConfiguration = configurationRoot.GetSection(nameof(DeterministicHashCodeConfiguration)).Get(); DriveConfiguration? driveConfiguration = configurationRoot.GetSection(nameof(DriveConfiguration)).Get(); EAFLogConfiguration? eafLogConfiguration = configurationRoot.GetSection(nameof(EAFLogConfiguration)).Get(); EDADatabaseConfiguration? edaDatabaseConfiguration = configurationRoot.GetSection(nameof(EDADatabaseConfiguration)).Get(); FileWatcherConfiguration? fileWatcherConfiguration = configurationRoot.GetSection(nameof(FileWatcherConfiguration)).Get(); InfinityQSConfiguration? infinityQSConfiguration = configurationRoot.GetSection(nameof(InfinityQSConfiguration)).Get(); IsoConfiguration? isoConfiguration = configurationRoot.GetSection(nameof(IsoConfiguration)).Get(); MetadataSettings? metadataSettings = configurationRoot.GetSection(nameof(MetadataSettings)).Get(); MetrologyConfiguration? metrologyConfiguration = configurationRoot.GetSection(nameof(MetrologyConfiguration)).Get(); NugetConfiguration? nugetConfiguration = configurationRoot.GetSection(nameof(NugetConfiguration)).Get(); ResultSettings? resultSettings = configurationRoot.GetSection(nameof(ResultSettings)).Get(); SerialConfiguration? serialConfiguration = configurationRoot.GetSection(nameof(SerialConfiguration)).Get(); StratusConfiguration? stratusConfiguration = configurationRoot.GetSection(nameof(StratusConfiguration)).Get(); TransmissionControlProtocolConfiguration? transmissionControlProtocolConfiguration = configurationRoot.GetSection(nameof(TransmissionControlProtocolConfiguration)).Get(); WaferCounterConfiguration? waferCounterConfiguration = configurationRoot.GetSection(nameof(WaferCounterConfiguration)).Get(); #pragma warning restore IL3050, IL2026 if (camstarOracleConfiguration is null || compassConfiguration is null || deterministicHashCodeConfiguration is null || driveConfiguration is null || eafLogConfiguration is null || edaDatabaseConfiguration is null || fileWatcherConfiguration is null || infinityQSConfiguration is null || isoConfiguration is null || metadataSettings is null || metrologyConfiguration is null || nugetConfiguration is null || resultSettings is null || serialConfiguration is null || stratusConfiguration is null || transmissionControlProtocolConfiguration is null || waferCounterConfiguration is null || fileWatcherConfiguration?.Company is null) { List paths = []; foreach (IConfigurationProvider configurationProvider in configurationRoot.Providers) { if (configurationProvider is not Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider jsonConfigurationProvider) continue; if (jsonConfigurationProvider.Source.FileProvider is not Microsoft.Extensions.FileProviders.PhysicalFileProvider physicalFileProvider) continue; paths.Add(physicalFileProvider.Root); } throw new NotSupportedException($"Not found!{Environment.NewLine}{string.Join(Environment.NewLine, paths.Distinct())}"); } result = new(camstarOracleConfiguration, compassConfiguration, deterministicHashCodeConfiguration, driveConfiguration, eafLogConfiguration, edaDatabaseConfiguration, fileWatcherConfiguration, infinityQSConfiguration, isoConfiguration, metadataSettings, metrologyConfiguration, nugetConfiguration, resultSettings, serialConfiguration, stratusConfiguration, transmissionControlProtocolConfiguration, waferCounterConfiguration); Verify(result); return result; } private static void Verify(AppSettings appSettings) { if (appSettings.DeterministicHashCodeConfiguration.MaxDegreeOfParallelism > Environment.ProcessorCount) throw new Exception($"Environment.ProcessorCount must be larger or equal to {nameof(appSettings.DeterministicHashCodeConfiguration.MaxDegreeOfParallelism)}"); } public override string ToString() { string result = JsonSerializer.Serialize(this, AppSettingsSourceGenerationContext.Default.AppSettings); return result; } } [JsonSourceGenerationOptions(WriteIndented = true)] [JsonSerializable(typeof(AppSettings))] internal partial class AppSettingsSourceGenerationContext : JsonSerializerContext { }