using Microsoft.Extensions.Configuration; using System.Text.Json; using System.Text.Json.Serialization; namespace View_by_Distance.Metadata.Models.Binder; public class ResultConfiguration { public string? DateGroup { get; set; } public int? EpicYear { get; set; } public string? ModelName { get; set; } public int? NumberOfJitters { get; set; } public int? NumberOfTimesToUpsample { get; set; } public string? PredictorModelName { get; set; } public int? ResultAllInOneSubdirectoryLength { get; set; } public string? ResultCollection { get; set; } public string? ResultContent { get; set; } public string? ResultSingleton { get; set; } public string? RootDirectory { get; set; } public override string ToString() { string result = JsonSerializer.Serialize(this, BinderResultConfigurationSourceGenerationContext.Default.ResultConfiguration); return result; } private static void PreVerify(IConfigurationRoot configurationRoot, ResultConfiguration? configuration) { if (configuration?.DateGroup is null) { 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; if (!physicalFileProvider.Root.Contains("UserSecrets")) continue; throw new NotSupportedException(physicalFileProvider.Root); } throw new NotSupportedException("Not Found!"); } } public static void Verify(ResultConfiguration configuration, bool requireRootDirectoryExists) { if (string.IsNullOrEmpty(configuration.DateGroup)) throw new NullReferenceException(nameof(configuration.DateGroup)); if (string.IsNullOrEmpty(configuration.RootDirectory) || (requireRootDirectoryExists && !Directory.Exists(configuration.RootDirectory))) throw new NullReferenceException(nameof(configuration.RootDirectory)); } private static Shared.Models.ResultConfiguration Get(ResultConfiguration? configuration, bool requireRootDirectoryExists) { Shared.Models.ResultConfiguration result; if (configuration is null) throw new NullReferenceException(nameof(configuration)); if (configuration.DateGroup is null) throw new NullReferenceException(nameof(configuration.DateGroup)); if (configuration.EpicYear is null) throw new NullReferenceException(nameof(configuration.EpicYear)); // if (configuration.ModelName is null) throw new NullReferenceException(nameof(configuration.ModelName)); // if (configuration.NumberOfJitters is null) throw new NullReferenceException(nameof(configuration.NumberOfJitters)); // if (configuration.NumberOfTimesToUpsample is null) throw new NullReferenceException(nameof(configuration.NumberOfTimesToUpsample)); // if (configuration.PredictorModelName is null) throw new NullReferenceException(nameof(configuration.PredictorModelName)); if (configuration.ResultAllInOneSubdirectoryLength is null) throw new NullReferenceException(nameof(configuration.ResultAllInOneSubdirectoryLength)); if (configuration.ResultCollection is null) throw new NullReferenceException(nameof(configuration.ResultCollection)); if (configuration.ResultContent is null) throw new NullReferenceException(nameof(configuration.ResultContent)); if (configuration.ResultSingleton is null) throw new NullReferenceException(nameof(configuration.ResultSingleton)); if (configuration.RootDirectory is null) throw new NullReferenceException(nameof(configuration.RootDirectory)); Verify(configuration, requireRootDirectoryExists); result = new(configuration.DateGroup, configuration.EpicYear.Value, configuration.ModelName, configuration.NumberOfJitters, configuration.NumberOfTimesToUpsample, configuration.PredictorModelName, configuration.ResultAllInOneSubdirectoryLength.Value, configuration.ResultCollection, configuration.ResultContent, configuration.ResultSingleton, Path.GetFullPath(configuration.RootDirectory)); return result; } public static Shared.Models.ResultConfiguration Get(IConfigurationRoot configurationRoot, bool requireRootDirectoryExists) { Shared.Models.ResultConfiguration result; IConfigurationSection configurationSection = configurationRoot.GetSection(nameof(Shared.Models.ResultConfiguration)); #pragma warning disable IL3050, IL2026 ResultConfiguration? configuration = configurationSection.Get(); #pragma warning restore IL3050, IL2026 PreVerify(configurationRoot, configuration); result = Get(configuration, requireRootDirectoryExists); return result; } } [JsonSourceGenerationOptions(WriteIndented = true)] [JsonSerializable(typeof(ResultConfiguration))] internal partial class BinderResultConfigurationSourceGenerationContext : JsonSerializerContext { }