using System; using System.Collections.Generic; using SabreTools.Data.Models.SeparatedValue; namespace SabreTools.Serialization.CrossModel { public partial class SeparatedValue : BaseMetadataSerializer { /// public override MetadataFile? Deserialize(Data.Models.Metadata.MetadataFile? obj) { if (obj is null) return null; var header = obj.Read(Data.Models.Metadata.MetadataFile.HeaderKey); var metadataFile = header is not null ? ConvertHeaderFromInternalModel(header) : new MetadataFile(); var machines = obj.Read(Data.Models.Metadata.MetadataFile.MachineKey); var items = new List(); foreach (var machine in machines ?? []) { items.AddRange(ConvertMachineFromInternalModel(machine, header)); } metadataFile.Row = [.. items]; return metadataFile; } /// /// Convert from to /// private static MetadataFile ConvertHeaderFromInternalModel(Data.Models.Metadata.Header item) { var metadataFile = new MetadataFile { Header = item.ReadStringArray(Data.Models.Metadata.Header.HeaderKey), }; return metadataFile; } /// /// Convert from to an array of /// private static Row[] ConvertMachineFromInternalModel(Data.Models.Metadata.Machine item, Data.Models.Metadata.Header? header) { var rowItems = new List(); var roms = item.Read(Data.Models.Metadata.Machine.RomKey); if (roms is not null && roms.Length > 0) { rowItems.AddRange( Array.ConvertAll(roms, r => ConvertFromInternalModel(r, item, header))); } var disks = item.Read(Data.Models.Metadata.Machine.DiskKey); if (disks is not null && disks.Length > 0) { rowItems.AddRange( Array.ConvertAll(disks, d => ConvertFromInternalModel(d, item, header))); } var media = item.Read(Data.Models.Metadata.Machine.MediaKey); if (media is not null && media.Length > 0) { rowItems.AddRange( Array.ConvertAll(media, m => ConvertFromInternalModel(m, item, header))); } return [.. rowItems]; } /// /// Convert from to /// private static Row ConvertFromInternalModel(Data.Models.Metadata.Disk item, Data.Models.Metadata.Machine parent, Data.Models.Metadata.Header? header) { var row = new Row { FileName = header?.ReadString("FILENAME"), // TODO: Make this an actual key to retrieve InternalName = header?.Name, Description = header?.Description, GameName = parent.Name, GameDescription = parent.Description, Type = "disk", RomName = null, DiskName = item.Name, Size = null, CRC = null, MD5 = item.ReadString(Data.Models.Metadata.Disk.MD5Key), SHA1 = item.ReadString(Data.Models.Metadata.Disk.SHA1Key), SHA256 = null, SHA384 = null, SHA512 = null, SpamSum = null, Status = item.Status, }; return row; } /// /// Convert from to /// private static Row ConvertFromInternalModel(Data.Models.Metadata.Media item, Data.Models.Metadata.Machine parent, Data.Models.Metadata.Header? header) { var row = new Row { FileName = header?.ReadString("FILENAME"), // TODO: Make this an actual key to retrieve on an item -- OriginalFilename InternalName = header?.Name, Description = header?.Description, GameName = parent.Name, GameDescription = parent.Description, Type = "media", RomName = null, DiskName = item.Name, Size = null, CRC = null, MD5 = item.ReadString(Data.Models.Metadata.Media.MD5Key), SHA1 = item.ReadString(Data.Models.Metadata.Media.SHA1Key), SHA256 = item.ReadString(Data.Models.Metadata.Media.SHA256Key), SHA384 = null, SHA512 = null, SpamSum = item.ReadString(Data.Models.Metadata.Media.SpamSumKey), }; return row; } /// /// Convert from to /// private static Row ConvertFromInternalModel(Data.Models.Metadata.Rom item, Data.Models.Metadata.Machine parent, Data.Models.Metadata.Header? header) { var row = new Row { FileName = header?.ReadString("FILENAME"), // TODO: Make this an actual key to retrieve InternalName = header?.Name, Description = header?.Description, GameName = parent.Name, GameDescription = parent.Description, Type = "rom", RomName = item.Name, DiskName = null, Size = item.Size, CRC = item.ReadString(Data.Models.Metadata.Rom.CRCKey), MD5 = item.ReadString(Data.Models.Metadata.Rom.MD5Key), SHA1 = item.ReadString(Data.Models.Metadata.Rom.SHA1Key), SHA256 = item.ReadString(Data.Models.Metadata.Rom.SHA256Key), SHA384 = item.ReadString(Data.Models.Metadata.Rom.SHA384Key), SHA512 = item.ReadString(Data.Models.Metadata.Rom.SHA512Key), SpamSum = item.ReadString(Data.Models.Metadata.Rom.SpamSumKey), Status = item.Status, }; return row; } } }