diff --git a/SabreTools.Serialization/Internal.SeparatedValue.cs b/SabreTools.Serialization/Internal.SeparatedValue.cs deleted file mode 100644 index 11899e48..00000000 --- a/SabreTools.Serialization/Internal.SeparatedValue.cs +++ /dev/null @@ -1,236 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using SabreTools.Models.Internal; - -namespace SabreTools.Serialization -{ - /// - /// Serializer for SeparatedValue models to internal structure - /// - public partial class Internal - { - #region Serialize - - /// - /// Convert from to - /// - public static MetadataFile ConvertToInternalModel(Models.SeparatedValue.MetadataFile item) - { - var metadataFile = new MetadataFile - { - [MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item), - }; - - if (item?.Row != null && item.Row.Any()) - metadataFile[MetadataFile.MachineKey] = item.Row.Select(ConvertMachineToInternalModel).ToArray(); - - return metadataFile; - } - - /// - /// Convert from to - /// - private static Header ConvertHeaderToInternalModel(Models.SeparatedValue.MetadataFile item) - { - var header = new Header - { - [Header.HeaderKey] = item.Header, - }; - - if (item.Row != null && item.Row.Any()) - { - var first = item.Row[0]; - //header[Header.FileNameKey] = first.FileName; // Not possible to map - header[Header.NameKey] = first.FileName; - header[Header.DescriptionKey] = first.Description; - } - - return header; - } - - /// - /// Convert from to - /// - private static Machine ConvertMachineToInternalModel(Models.SeparatedValue.Row item) - { - var machine = new Machine - { - [Machine.NameKey] = item.GameName, - [Machine.DescriptionKey] = item.GameDescription, - }; - - var datItem = ConvertToInternalModel(item); - switch (datItem) - { - case Disk disk: - machine[Machine.DiskKey] = new Disk[] { disk }; - break; - - case Media media: - machine[Machine.MediaKey] = new Media[] { media }; - break; - - case Rom rom: - machine[Machine.RomKey] = new Rom[] { rom }; - break; - } - - return machine; - } - - /// - /// Convert from to - /// - private static DatItem? ConvertToInternalModel(Models.SeparatedValue.Row item) - { - return item.Type switch - { - "disk" => new Disk - { - [Disk.NameKey] = item.DiskName, - [Disk.MD5Key] = item.MD5, - [Disk.SHA1Key] = item.SHA1, - [Disk.StatusKey] = item.Status, - }, - "media" => new Media - { - [Media.NameKey] = item.DiskName, - [Media.MD5Key] = item.MD5, - [Media.SHA1Key] = item.SHA1, - [Media.SHA256Key] = item.SHA256, - [Media.SpamSumKey] = item.SpamSum, - }, - "rom" => new Rom - { - [Rom.NameKey] = item.RomName, - [Rom.SizeKey] = item.Size, - [Rom.CRCKey] = item.CRC, - [Rom.MD5Key] = item.MD5, - [Rom.SHA1Key] = item.SHA1, - [Rom.SHA256Key] = item.SHA256, - [Rom.SHA384Key] = item.SHA384, - [Rom.SHA512Key] = item.SHA512, - [Rom.SpamSumKey] = item.SpamSum, - [Rom.StatusKey] = item.Status, - }, - _ => null, - }; - } - - #endregion - - #region Deserialize - - /// - /// Convert from to - /// - public static Models.SeparatedValue.MetadataFile? ConvertHeaderToSeparatedValue(Header? item) - { - if (item == null) - return null; - - var metadataFile = new Models.SeparatedValue.MetadataFile - { - Header = item.ReadStringArray(Header.HeaderKey), - }; - return metadataFile; - } - - /// - /// Convert from to an array of - /// - public static Models.SeparatedValue.Row[]? ConvertMachineToSeparatedValue(Machine? item) - { - if (item == null) - return null; - - var rowItems = new List(); - - var disks = item.Read(Machine.DiskKey); - if (disks != null) - rowItems.AddRange(disks.Select(disk => ConvertToSeparatedValue(disk, item))); - - var media = item.Read(Machine.MediaKey); - if (media != null) - rowItems.AddRange(media.Select(medium => ConvertToSeparatedValue(medium, item))); - - var roms = item.Read(Machine.RomKey); - if (roms != null) - rowItems.AddRange(roms.Select(rom => ConvertToSeparatedValue(rom, item))); - - return rowItems.ToArray(); - } - - /// - /// Convert from to - /// - private static Models.SeparatedValue.Row? ConvertToSeparatedValue(Disk? item, Machine? parent) - { - if (item == null) - return null; - - var row = new Models.SeparatedValue.Row - { - GameName = parent?.ReadString(Machine.NameKey), - Description = parent?.ReadString(Machine.DescriptionKey), - Type = "disk", - DiskName = item.ReadString(Disk.NameKey), - MD5 = item.ReadString(Disk.MD5Key), - SHA1 = item.ReadString(Disk.SHA1Key), - Status = item.ReadString(Disk.StatusKey), - }; - return row; - } - - /// - /// Convert from to - /// - private static Models.SeparatedValue.Row? ConvertToSeparatedValue(Media? item, Machine? parent) - { - if (item == null) - return null; - - var row = new Models.SeparatedValue.Row - { - GameName = parent?.ReadString(Machine.NameKey), - Description = parent?.ReadString(Machine.DescriptionKey), - Type = "media", - DiskName = item.ReadString(Media.NameKey), - MD5 = item.ReadString(Media.MD5Key), - SHA1 = item.ReadString(Media.SHA1Key), - SHA256 = item.ReadString(Media.SHA256Key), - SpamSum = item.ReadString(Media.SpamSumKey), - }; - return row; - } - - /// - /// Convert from to - /// - private static Models.SeparatedValue.Row? ConvertToSeparatedValue(Rom? item, Machine? parent) - { - if (item == null) - return null; - - var row = new Models.SeparatedValue.Row - { - GameName = parent?.ReadString(Machine.NameKey), - Description = parent?.ReadString(Machine.DescriptionKey), - Type = "rom", - RomName = item.ReadString(Rom.NameKey), - Size = item.ReadString(Rom.SizeKey), - CRC = item.ReadString(Rom.CRCKey), - MD5 = item.ReadString(Rom.MD5Key), - SHA1 = item.ReadString(Rom.SHA1Key), - SHA256 = item.ReadString(Rom.SHA256Key), - SHA384 = item.ReadString(Rom.SHA384Key), - SHA512 = item.ReadString(Rom.SHA512Key), - SpamSum = item.ReadString(Rom.SpamSumKey), - Status = item.ReadString(Rom.StatusKey), - }; - return row; - } - - #endregion - } -} \ No newline at end of file diff --git a/SabreTools.Serialization/SeparatedValue.Deserializer.cs b/SabreTools.Serialization/SeparatedValue.Deserializer.cs index f93bd78d..2acf46de 100644 --- a/SabreTools.Serialization/SeparatedValue.Deserializer.cs +++ b/SabreTools.Serialization/SeparatedValue.Deserializer.cs @@ -119,5 +119,120 @@ namespace SabreTools.Serialization dat.Row = rows.ToArray(); return dat; } + + // TODO: Add deserialization of entire MetadataFile + #region Internal + + /// + /// Convert from to + /// + public static MetadataFile? ConvertHeaderFromInternalModel(Models.Internal.Header? item) + { + if (item == null) + return null; + + var metadataFile = new MetadataFile + { + Header = item.ReadStringArray(Models.Internal.Header.HeaderKey), + }; + return metadataFile; + } + + /// + /// Convert from to an array of + /// + public static Row[]? ConvertMachineFromInternalModel(Models.Internal.Machine? item) + { + if (item == null) + return null; + + var rowItems = new List(); + + var disks = item.Read(Models.Internal.Machine.DiskKey); + if (disks != null) + rowItems.AddRange(disks.Select(disk => ConvertFromInternalModel(disk, item))); + + var media = item.Read(Models.Internal.Machine.MediaKey); + if (media != null) + rowItems.AddRange(media.Select(medium => ConvertFromInternalModel(medium, item))); + + var roms = item.Read(Models.Internal.Machine.RomKey); + if (roms != null) + rowItems.AddRange(roms.Select(rom => ConvertFromInternalModel(rom, item))); + + return rowItems.ToArray(); + } + + /// + /// Convert from to + /// + private static Row? ConvertFromInternalModel(Models.Internal.Disk? item, Models.Internal.Machine? parent) + { + if (item == null) + return null; + + var row = new Row + { + GameName = parent?.ReadString(Models.Internal.Machine.NameKey), + Description = parent?.ReadString(Models.Internal.Machine.DescriptionKey), + Type = "disk", + DiskName = item.ReadString(Models.Internal.Disk.NameKey), + MD5 = item.ReadString(Models.Internal.Disk.MD5Key), + SHA1 = item.ReadString(Models.Internal.Disk.SHA1Key), + Status = item.ReadString(Models.Internal.Disk.StatusKey), + }; + return row; + } + + /// + /// Convert from to + /// + private static Row? ConvertFromInternalModel(Models.Internal.Media? item, Models.Internal.Machine? parent) + { + if (item == null) + return null; + + var row = new Row + { + GameName = parent?.ReadString(Models.Internal.Machine.NameKey), + Description = parent?.ReadString(Models.Internal.Machine.DescriptionKey), + Type = "media", + DiskName = item.ReadString(Models.Internal.Media.NameKey), + MD5 = item.ReadString(Models.Internal.Media.MD5Key), + SHA1 = item.ReadString(Models.Internal.Media.SHA1Key), + SHA256 = item.ReadString(Models.Internal.Media.SHA256Key), + SpamSum = item.ReadString(Models.Internal.Media.SpamSumKey), + }; + return row; + } + + /// + /// Convert from to + /// + private static Row? ConvertFromInternalModel(Models.Internal.Rom? item, Models.Internal.Machine? parent) + { + if (item == null) + return null; + + var row = new Row + { + GameName = parent?.ReadString(Models.Internal.Machine.NameKey), + Description = parent?.ReadString(Models.Internal.Machine.DescriptionKey), + Type = "rom", + RomName = item.ReadString(Models.Internal.Rom.NameKey), + Size = item.ReadString(Models.Internal.Rom.SizeKey), + CRC = item.ReadString(Models.Internal.Rom.CRCKey), + MD5 = item.ReadString(Models.Internal.Rom.MD5Key), + SHA1 = item.ReadString(Models.Internal.Rom.SHA1Key), + SHA256 = item.ReadString(Models.Internal.Rom.SHA256Key), + SHA384 = item.ReadString(Models.Internal.Rom.SHA384Key), + SHA512 = item.ReadString(Models.Internal.Rom.SHA512Key), + SpamSum = item.ReadString(Models.Internal.Rom.SpamSumKey), + Status = item.ReadString(Models.Internal.Rom.StatusKey), + }; + return row; + } + + #endregion } } \ No newline at end of file diff --git a/SabreTools.Serialization/SeparatedValue.Serializer.cs b/SabreTools.Serialization/SeparatedValue.Serializer.cs index 9421d5f0..5b7b2f88 100644 --- a/SabreTools.Serialization/SeparatedValue.Serializer.cs +++ b/SabreTools.Serialization/SeparatedValue.Serializer.cs @@ -127,5 +127,115 @@ namespace SabreTools.Serialization writer.Flush(); } } + + #region Internal + + /// + /// Convert from to + /// + public static Models.Internal.MetadataFile ConvertToInternalModel(MetadataFile item) + { + var metadataFile = new Models.Internal.MetadataFile + { + [Models.Internal.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item), + }; + + if (item?.Row != null && item.Row.Any()) + metadataFile[Models.Internal.MetadataFile.MachineKey] = item.Row.Select(ConvertMachineToInternalModel).ToArray(); + + return metadataFile; + } + + /// + /// Convert from to + /// + private static Models.Internal.Header ConvertHeaderToInternalModel(MetadataFile item) + { + var header = new Models.Internal.Header + { + [Models.Internal.Header.HeaderKey] = item.Header, + }; + + if (item.Row != null && item.Row.Any()) + { + var first = item.Row[0]; + //header[Models.Internal.Header.FileNameKey] = first.FileName; // Not possible to map + header[Models.Internal.Header.NameKey] = first.FileName; + header[Models.Internal.Header.DescriptionKey] = first.Description; + } + + return header; + } + + /// + /// Convert from to + /// + private static Models.Internal.Machine ConvertMachineToInternalModel(Row item) + { + var machine = new Models.Internal.Machine + { + [Models.Internal.Machine.NameKey] = item.GameName, + [Models.Internal.Machine.DescriptionKey] = item.GameDescription, + }; + + var datItem = ConvertToInternalModel(item); + switch (datItem) + { + case Models.Internal.Disk disk: + machine[Models.Internal.Machine.DiskKey] = new Models.Internal.Disk[] { disk }; + break; + + case Models.Internal.Media media: + machine[Models.Internal.Machine.MediaKey] = new Models.Internal.Media[] { media }; + break; + + case Models.Internal.Rom rom: + machine[Models.Internal.Machine.RomKey] = new Models.Internal.Rom[] { rom }; + break; + } + + return machine; + } + + /// + /// Convert from to + /// + private static Models.Internal.DatItem? ConvertToInternalModel(Row item) + { + return item.Type switch + { + "disk" => new Models.Internal.Disk + { + [Models.Internal.Disk.NameKey] = item.DiskName, + [Models.Internal.Disk.MD5Key] = item.MD5, + [Models.Internal.Disk.SHA1Key] = item.SHA1, + [Models.Internal.Disk.StatusKey] = item.Status, + }, + "media" => new Models.Internal.Media + { + [Models.Internal.Media.NameKey] = item.DiskName, + [Models.Internal.Media.MD5Key] = item.MD5, + [Models.Internal.Media.SHA1Key] = item.SHA1, + [Models.Internal.Media.SHA256Key] = item.SHA256, + [Models.Internal.Media.SpamSumKey] = item.SpamSum, + }, + "rom" => new Models.Internal.Rom + { + [Models.Internal.Rom.NameKey] = item.RomName, + [Models.Internal.Rom.SizeKey] = item.Size, + [Models.Internal.Rom.CRCKey] = item.CRC, + [Models.Internal.Rom.MD5Key] = item.MD5, + [Models.Internal.Rom.SHA1Key] = item.SHA1, + [Models.Internal.Rom.SHA256Key] = item.SHA256, + [Models.Internal.Rom.SHA384Key] = item.SHA384, + [Models.Internal.Rom.SHA512Key] = item.SHA512, + [Models.Internal.Rom.SpamSumKey] = item.SpamSum, + [Models.Internal.Rom.StatusKey] = item.Status, + }, + _ => null, + }; + } + + #endregion } } \ No newline at end of file