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, DiskInfoConfiguration DiskInfoConfiguration, DriveConfiguration DriveConfiguration, EAFLogConfiguration EAFLogConfiguration, EDADatabaseConfiguration EDADatabaseConfiguration, FileWatcherConfiguration FileWatcherConfiguration, InfinityQSConfiguration InfinityQSConfiguration, IsoConfiguration IsoConfiguration, MetadataSettings MetadataSettings, MetrologyConfiguration MetrologyConfiguration, NugetConfiguration NugetConfiguration, ResultSettings ResultSettings, SeleniumConfiguration SeleniumConfiguration, SerialConfiguration SerialConfiguration, StratusConfiguration StratusConfiguration, SyncConfiguration SyncConfiguration, 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(); DiskInfoConfiguration? diskInfoConfiguration = configurationRoot.GetSection(nameof(DiskInfoConfiguration)).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(); SeleniumConfiguration? seleniumConfiguration = configurationRoot.GetSection(nameof(SeleniumConfiguration)).Get(); SerialConfiguration? serialConfiguration = configurationRoot.GetSection(nameof(SerialConfiguration)).Get(); StratusConfiguration? stratusConfiguration = configurationRoot.GetSection(nameof(StratusConfiguration)).Get(); SyncConfiguration? syncConfiguration = configurationRoot.GetSection(nameof(SyncConfiguration)).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 || diskInfoConfiguration 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 || seleniumConfiguration is null || serialConfiguration is null || stratusConfiguration is null || syncConfiguration 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, diskInfoConfiguration, driveConfiguration, eafLogConfiguration, edaDatabaseConfiguration, fileWatcherConfiguration, infinityQSConfiguration, isoConfiguration, metadataSettings, metrologyConfiguration, nugetConfiguration, resultSettings, seleniumConfiguration, serialConfiguration, stratusConfiguration, syncConfiguration, 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 { }