using Microsoft.Extensions.Configuration; using System.Text.Json; using System.Text.Json.Serialization; namespace View_by_Distance.Metadata.Models.Binder; public class MetadataConfiguration { public bool? ForceMetadataLastWriteTimeToCreationTime { get; set; } public string[]? IgnoreRulesKeyWords { get; set; } public int? IntMinValueLength { get; set; } public int? Offset { get; set; } public bool? PropertiesChangedForMetadata { get; set; } public override string ToString() { string result = JsonSerializer.Serialize(this, BinderMetadataConfigurationSourceGenerationContext.Default.MetadataConfiguration); return result; } private static void PreVerify(IConfigurationRoot configurationRoot, MetadataConfiguration? configuration) { if (configuration?.ForceMetadataLastWriteTimeToCreationTime 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())}"); } } private static void Verify(MetadataConfiguration configuration) { if (configuration.IntMinValueLength is null || configuration.IntMinValueLength != int.MinValue.ToString().Length) throw new NotSupportedException(nameof(configuration.IgnoreRulesKeyWords)); if (configuration.IgnoreRulesKeyWords is null || configuration.IgnoreRulesKeyWords.Length == 0) throw new NullReferenceException(nameof(configuration.IgnoreRulesKeyWords)); } private static Shared.Models.MetadataConfiguration Get(MetadataConfiguration? configuration, Shared.Models.ResultConfiguration resultConfiguration) { Shared.Models.MetadataConfiguration result; if (configuration is null) throw new NullReferenceException(nameof(configuration)); if (configuration.ForceMetadataLastWriteTimeToCreationTime is null) throw new NullReferenceException(nameof(configuration.ForceMetadataLastWriteTimeToCreationTime)); if (configuration.IntMinValueLength is null) throw new NullReferenceException(nameof(configuration.IntMinValueLength)); if (configuration.IgnoreRulesKeyWords is null) throw new NullReferenceException(nameof(configuration.IgnoreRulesKeyWords)); if (configuration.Offset is null) throw new NullReferenceException(nameof(configuration.Offset)); if (configuration.PropertiesChangedForMetadata is null) throw new NullReferenceException(nameof(configuration.PropertiesChangedForMetadata)); Verify(configuration); result = new(resultConfiguration, configuration.ForceMetadataLastWriteTimeToCreationTime.Value, configuration.IgnoreRulesKeyWords, configuration.IntMinValueLength.Value, configuration.Offset.Value, configuration.PropertiesChangedForMetadata.Value); return result; } public static Shared.Models.MetadataConfiguration Get(IConfigurationRoot configurationRoot, Shared.Models.ResultConfiguration resultConfiguration) { Shared.Models.MetadataConfiguration result; IConfigurationSection configurationSection = configurationRoot.GetSection(nameof(Shared.Models.MetadataConfiguration)); #pragma warning disable IL3050, IL2026 MetadataConfiguration? configuration = configurationSection.Get(); #pragma warning restore IL3050, IL2026 PreVerify(configurationRoot, configuration); result = Get(configuration, resultConfiguration); return result; } } [JsonSourceGenerationOptions(WriteIndented = true)] [JsonSerializable(typeof(MetadataConfiguration))] internal partial class BinderMetadataConfigurationSourceGenerationContext : JsonSerializerContext { }