using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; using System.Linq; using Newtonsoft.Json.Linq; namespace Pf2e.Scrapper.Importers.Implementations.FoundryEn.Compendium; /// /// Загрузчик данных компендиума. /// /// public sealed class FoundryEnCompendium(FoundryEnRepository repository) : AbstractCompendium { /// public override FoundryEnRepository Repository { get; } = repository; /// /// Коллекция всех записей компендиума. /// public ConcurrentBag Items { get; } = []; /// public override int Count(params ICollection types) => types.Count == 0 ? Items.Count : Items.Count(i => types.Contains(i.Type)); /// public override IEnumerable> Iterate( params ICollection types ) { IEnumerable files = types.Count == 0 ? Items.Select(item => item.File).Distinct() : Items .Where(item => types.Contains(item.Type)) .Select(item => item.File) .Distinct(); foreach (string file in files) { Dictionary fileReferences = Items .Where(i => i.File == file) .ToDictionary(i => i.Id); using StreamReader fileReader = new(file); JArray array = JArray.Parse(fileReader.ReadToEnd()); foreach (JToken item in array) { string? id = item.SelectToken("_id")?.ToString(); if ( id is null || !fileReferences.TryGetValue(id, out FoundryEnCompendiumItem? reference) || (types.Count > 0 && !types.Contains(reference.Type)) ) { continue; } yield return new(reference, (JObject)item); } } } }