using System; using System.Collections.Generic; using System.Collections.Immutable; using System.IO; using System.Linq; using System.Text.Json; using PkmnLib.Dataloader.Models; using PkmnLib.Static; using PkmnLib.Static.Libraries; using PkmnLib.Static.Moves; using PkmnLib.Static.Utils; namespace PkmnLib.Dataloader; public static class ItemDataLoader { public static ItemLibrary LoadItems(Stream stream) { var library = new ItemLibrary(); var obj = JsonSerializer.Deserialize(stream, JsonOptions.DefaultOptions); if (obj == null) throw new InvalidDataException("Item data is empty."); var items = obj.Select(DeserializeItem); foreach (var i in items) library.Add(i); return library; } // ReSharper disable once MemberCanBePrivate.Global public static Func, ISecondaryEffect?, ISecondaryEffect?, // ReSharper disable once FieldCanBeMadeReadOnly.Global IItem> ItemConstructor = (_, name, type, battleType, price, flags, effect, battleTriggerEffect) => new ItemImpl(name, type, battleType, price, flags, effect, battleTriggerEffect); private static IItem DeserializeItem(SerializedItem serialized) { if (!Enum.TryParse(serialized.ItemType, true, out var itemType)) throw new InvalidDataException($"Item type {serialized.ItemType} is not valid for item {serialized.Name}."); Enum.TryParse(serialized.BattleType, true, out BattleItemCategory battleType); var effect = serialized.Effect?.ParseEffect(); var battleTriggerEffect = serialized.BattleEffect?.ParseEffect(); return ItemConstructor(serialized, serialized.Name, itemType, battleType, serialized.Price, serialized.Flags.Select(x => (StringKey)x).ToImmutableHashSet(), effect, battleTriggerEffect); } }