Reduce implicit null checks

This commit is contained in:
Matt Nadareski
2023-08-10 11:35:32 -04:00
parent 5213490689
commit c59bd4d857
35 changed files with 1406 additions and 783 deletions

View File

@@ -273,7 +273,7 @@ namespace SabreTools.DatFiles.Formats
ConvertDeviceRefs(game.DeviceRef, machine, filename, indexId, statsOnly, ref containsItems); ConvertDeviceRefs(game.DeviceRef, machine, filename, indexId, statsOnly, ref containsItems);
ConvertSamples(game.Sample, machine, filename, indexId, statsOnly, ref containsItems); ConvertSamples(game.Sample, machine, filename, indexId, statsOnly, ref containsItems);
ConvertArchives(game.Archive, machine, filename, indexId, statsOnly, ref containsItems); ConvertArchives(game.Archive, machine, filename, indexId, statsOnly, ref containsItems);
ConvertDrivers(game.Driver, machine, filename, indexId, statsOnly, ref containsItems); ConvertDriver(game.Driver, machine, filename, indexId, statsOnly, ref containsItems);
ConvertSoftwareLists(game.SoftwareList, machine, filename, indexId, statsOnly, ref containsItems); ConvertSoftwareLists(game.SoftwareList, machine, filename, indexId, statsOnly, ref containsItems);
// If we had no items, create a Blank placeholder // If we had no items, create a Blank placeholder
@@ -599,42 +599,39 @@ namespace SabreTools.DatFiles.Formats
/// <summary> /// <summary>
/// Convert Driver information /// Convert Driver information
/// </summary> /// </summary>
/// <param name="drivers">Array of deserialized models to convert</param> /// <param name="driver">Deserialized model to convert</param>
/// <param name="machine">Prefilled machine to use</param> /// <param name="machine">Prefilled machine to use</param>
/// <param name="filename">Name of the file to be parsed</param> /// <param name="filename">Name of the file to be parsed</param>
/// <param name="indexId">Index ID for the DAT</param> /// <param name="indexId">Index ID for the DAT</param>
/// <param name="statsOnly">True to only add item statistics while parsing, false otherwise</param> /// <param name="statsOnly">True to only add item statistics while parsing, false otherwise</param>
/// <param name="containsItems">True if there were any items in the array, false otherwise</param> /// <param name="containsItems">True if there were any items in the array, false otherwise</param>
private void ConvertDrivers(Models.Logiqx.Driver[]? drivers, Machine machine, string filename, int indexId, bool statsOnly, ref bool containsItems) private void ConvertDriver(Models.Logiqx.Driver? driver, Machine machine, string filename, int indexId, bool statsOnly, ref bool containsItems)
{ {
// If the drivers array is missing, we can't do anything // If the driver is missing, we can't do anything
if (drivers == null || !drivers.Any()) if (driver == null)
return; return;
containsItems = true; containsItems = true;
foreach (var driver in drivers) var item = new Driver
{ {
var item = new Driver Status = driver.Status?.AsSupportStatus() ?? SupportStatus.NULL,
Emulation = driver.Emulation?.AsSupportStatus() ?? SupportStatus.NULL,
Cocktail = driver.Cocktail?.AsSupportStatus() ?? SupportStatus.NULL,
SaveState = driver.SaveState?.AsSupported() ?? Supported.NULL,
RequiresArtwork = driver.RequiresArtwork?.AsYesNo(),
Unofficial = driver.Unofficial?.AsYesNo(),
NoSoundHardware = driver.NoSoundHardware?.AsYesNo(),
Incomplete = driver.Incomplete?.AsYesNo(),
Source = new Source
{ {
Status = driver.Status?.AsSupportStatus() ?? SupportStatus.NULL, Index = indexId,
Emulation = driver.Emulation?.AsSupportStatus() ?? SupportStatus.NULL, Name = filename,
Cocktail = driver.Cocktail?.AsSupportStatus() ?? SupportStatus.NULL, },
SaveState = driver.SaveState?.AsSupported() ?? Supported.NULL, };
RequiresArtwork = driver.RequiresArtwork?.AsYesNo(),
Unofficial = driver.Unofficial?.AsYesNo(),
NoSoundHardware = driver.NoSoundHardware?.AsYesNo(),
Incomplete = driver.Incomplete?.AsYesNo(),
Source = new Source item.CopyMachineInformation(machine);
{ ParseAddHelper(item, statsOnly);
Index = indexId,
Name = filename,
},
};
item.CopyMachineInformation(machine);
ParseAddHelper(item, statsOnly);
}
} }
/// <summary> /// <summary>

View File

@@ -314,7 +314,6 @@ namespace SabreTools.DatFiles.Formats
var samples = new List<Models.Logiqx.Sample>(); var samples = new List<Models.Logiqx.Sample>();
var archives = new List<Models.Logiqx.Archive>(); var archives = new List<Models.Logiqx.Archive>();
var devicerefs = new List<Models.Logiqx.DeviceRef>(); var devicerefs = new List<Models.Logiqx.DeviceRef>();
var drivers = new List<Models.Logiqx.Driver>();
var softwarelists = new List<Models.Logiqx.SoftwareList>(); var softwarelists = new List<Models.Logiqx.SoftwareList>();
// Loop through and convert the items to respective lists // Loop through and convert the items to respective lists
@@ -357,7 +356,7 @@ namespace SabreTools.DatFiles.Formats
devicerefs.Add(CreateDeviceRef(deviceref)); devicerefs.Add(CreateDeviceRef(deviceref));
break; break;
case Driver driver: case Driver driver:
drivers.Add(CreateDriver(driver)); game.Driver = CreateDriver(driver);
break; break;
case DatItems.Formats.SoftwareList softwarelist: case DatItems.Formats.SoftwareList softwarelist:
softwarelists.Add(CreateSoftwareList(softwarelist)); softwarelists.Add(CreateSoftwareList(softwarelist));
@@ -374,7 +373,6 @@ namespace SabreTools.DatFiles.Formats
game.Sample = samples.ToArray(); game.Sample = samples.ToArray();
game.Archive = archives.ToArray(); game.Archive = archives.ToArray();
game.DeviceRef = devicerefs.ToArray(); game.DeviceRef = devicerefs.ToArray();
game.Driver = drivers.ToArray();
game.SoftwareList = softwarelists.ToArray(); game.SoftwareList = softwarelists.ToArray();
// Add the game to the list // Add the game to the list

View File

@@ -60,7 +60,7 @@ namespace SabreTools.Models.ClrMamePro
public Chip[]? Chip { get; set; } public Chip[]? Chip { get; set; }
/// <remarks>video, Appears after Chip</remarks> /// <remarks>video, Appears after Chip</remarks>
public Video? Video { get; set; } public Video[]? Video { get; set; }
/// <remarks>sound, Appears after Video</remarks> /// <remarks>sound, Appears after Video</remarks>
public Sound? Sound { get; set; } public Sound? Sound { get; set; }

View File

@@ -61,6 +61,9 @@ namespace SabreTools.Models.Internal
/// <remarks>DipSwitch[]</remarks> /// <remarks>DipSwitch[]</remarks>
public const string DipSwitchKey = "dipswitch"; public const string DipSwitchKey = "dipswitch";
/// <remarks>string</remarks>
public const string DirNameKey = "dirName";
/// <remarks>Disk[]</remarks> /// <remarks>Disk[]</remarks>
public const string DiskKey = "disk"; public const string DiskKey = "disk";
@@ -73,7 +76,7 @@ namespace SabreTools.Models.Internal
/// <remarks>string</remarks> /// <remarks>string</remarks>
public const string DisplayTypeKey = "displaytype"; public const string DisplayTypeKey = "displaytype";
/// <remarks>Driver, Driver[]</remarks> /// <remarks>Driver</remarks>
public const string DriverKey = "driver"; public const string DriverKey = "driver";
/// <remarks>Dump[]</remarks> /// <remarks>Dump[]</remarks>
@@ -230,7 +233,7 @@ namespace SabreTools.Models.Internal
/// <remarks>Trurip</remarks> /// <remarks>Trurip</remarks>
public const string TruripKey = "trurip"; public const string TruripKey = "trurip";
/// <remarks>Video, Video[]</remarks> /// <remarks>Video[]</remarks>
public const string VideoKey = "video"; public const string VideoKey = "video";
/// <remarks>string</remarks> /// <remarks>string</remarks>

View File

@@ -102,10 +102,9 @@ namespace SabreTools.Models.Logiqx
[XmlElement("archive")] [XmlElement("archive")]
public Archive[]? Archive { get; set; } public Archive[]? Archive { get; set; }
/// TODO: Validate multiple can exist
/// <remarks>MAME extension</remarks> /// <remarks>MAME extension</remarks>
[XmlElement("driver")] [XmlElement("driver")]
public Driver[]? Driver { get; set; } public Driver? Driver { get; set; }
/// <remarks>MAME extension</remarks> /// <remarks>MAME extension</remarks>
[XmlElement("softwarelist")] [XmlElement("softwarelist")]

View File

@@ -1,3 +1,4 @@
using System;
using System.Linq; using System.Linq;
using SabreTools.Models.ArchiveDotOrg; using SabreTools.Models.ArchiveDotOrg;
@@ -22,7 +23,12 @@ namespace SabreTools.Serialization
var machines = item.Read<Models.Internal.Machine[]>(Models.Internal.MetadataFile.MachineKey); var machines = item.Read<Models.Internal.Machine[]>(Models.Internal.MetadataFile.MachineKey);
if (machines != null && machines.Any()) if (machines != null && machines.Any())
files.File = machines.SelectMany(ConvertFromInternalModel).ToArray(); {
files.File = machines
.Where(m => m != null)
.SelectMany(ConvertFromInternalModel)
.ToArray();
}
return files; return files;
} }
@@ -30,23 +36,22 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Machine"/> to an array of <cref="Models.ArchiveDotOrg.File"/> /// Convert from <cref="Models.Internal.Machine"/> to an array of <cref="Models.ArchiveDotOrg.File"/>
/// </summary> /// </summary>
private static File[]? ConvertFromInternalModel(Models.Internal.Machine? item) private static File[] ConvertFromInternalModel(Models.Internal.Machine item)
{ {
if (item == null)
return null;
var roms = item.Read<Models.Internal.Rom[]>(Models.Internal.Machine.RomKey); var roms = item.Read<Models.Internal.Rom[]>(Models.Internal.Machine.RomKey);
return roms?.Select(ConvertFromInternalModel)?.ToArray(); if (roms == null)
return Array.Empty<File>();
return roms
.Where(r => r != null)
.Select(ConvertFromInternalModel).ToArray();
} }
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Rom"/> to <cref="Models.ArchiveDotOrg.File"/> /// Convert from <cref="Models.Internal.Rom"/> to <cref="Models.ArchiveDotOrg.File"/>
/// </summary> /// </summary>
private static File? ConvertFromInternalModel(Models.Internal.Rom? item) private static File ConvertFromInternalModel(Models.Internal.Rom item)
{ {
if (item == null)
return null;
var file = new File var file = new File
{ {
Name = item.ReadString(Models.Internal.Rom.NameKey), Name = item.ReadString(Models.Internal.Rom.NameKey),

View File

@@ -13,15 +13,23 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.ArchiveDotOrg.Files"/> to <cref="Models.Internal.MetadataFile"/> /// Convert from <cref="Models.ArchiveDotOrg.Files"/> to <cref="Models.Internal.MetadataFile"/>
/// </summary> /// </summary>
public static Models.Internal.MetadataFile ConvertToInternalModel(Files item) public static Models.Internal.MetadataFile? ConvertToInternalModel(Files? item)
{ {
if (item == null)
return null;
var metadataFile = new Models.Internal.MetadataFile var metadataFile = new Models.Internal.MetadataFile
{ {
[Models.Internal.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item), [Models.Internal.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item),
}; };
if (item?.File != null && item.File.Any()) if (item?.File != null && item.File.Any())
metadataFile[Models.Internal.MetadataFile.MachineKey] = item.File.Select(ConvertMachineToInternalModel).ToArray(); {
metadataFile[Models.Internal.MetadataFile.MachineKey] = item.File
.Where(f => f != null)
.Select(ConvertMachineToInternalModel)
.ToArray();
}
return metadataFile; return metadataFile;
} }

View File

@@ -1,3 +1,4 @@
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
@@ -136,7 +137,12 @@ namespace SabreTools.Serialization
var machines = item.Read<Models.Internal.Machine[]>(Models.Internal.MetadataFile.MachineKey); var machines = item.Read<Models.Internal.Machine[]>(Models.Internal.MetadataFile.MachineKey);
if (machines != null && machines.Any()) if (machines != null && machines.Any())
metadataFile.Row = machines.SelectMany(ConvertMachineFromInternalModel).ToArray(); {
metadataFile.Row = machines
.Where(m => m != null)
.SelectMany(ConvertMachineFromInternalModel)
.ToArray();
}
return metadataFile; return metadataFile;
} }
@@ -144,11 +150,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Header"/> to <cref="Models.AttractMode.MetadataFile"/> /// Convert from <cref="Models.Internal.Header"/> to <cref="Models.AttractMode.MetadataFile"/>
/// </summary> /// </summary>
private static MetadataFile? ConvertHeaderFromInternalModel(Models.Internal.Header? item) private static MetadataFile ConvertHeaderFromInternalModel(Models.Internal.Header item)
{ {
if (item == null)
return null;
var metadataFile = new MetadataFile var metadataFile = new MetadataFile
{ {
Header = item.ReadStringArray(Models.Internal.Header.HeaderKey), Header = item.ReadStringArray(Models.Internal.Header.HeaderKey),
@@ -159,55 +162,46 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Machine"/> to an array of <cref="Models.AttractMode.Row"/> /// Convert from <cref="Models.Internal.Machine"/> to an array of <cref="Models.AttractMode.Row"/>
/// </summary> /// </summary>
private static Row?[]? ConvertMachineFromInternalModel(Models.Internal.Machine? item) private static Row[] ConvertMachineFromInternalModel(Models.Internal.Machine item)
{ {
if (item == null)
return null;
var roms = item.Read<Models.Internal.Rom[]>(Models.Internal.Machine.RomKey); var roms = item.Read<Models.Internal.Rom[]>(Models.Internal.Machine.RomKey);
return roms?.Select(rom => if (roms == null || !roms.Any())
{ return Array.Empty<Row>();
if (rom == null)
return null;
var rowItem = ConvertFromInternalModel(rom); return roms
.Where(r => r != null)
rowItem.Name = item.ReadString(Models.Internal.Machine.NameKey); .Select(rom => ConvertFromInternalModel(rom, item))
rowItem.Emulator = item.ReadString(Models.Internal.Machine.EmulatorKey); .ToArray();
rowItem.CloneOf = item.ReadString(Models.Internal.Machine.CloneOfKey);
rowItem.Year = item.ReadString(Models.Internal.Machine.YearKey);
rowItem.Manufacturer = item.ReadString(Models.Internal.Machine.ManufacturerKey);
rowItem.Category = item.ReadString(Models.Internal.Machine.CategoryKey);
rowItem.Players = item.ReadString(Models.Internal.Machine.PlayersKey);
rowItem.Rotation = item.ReadString(Models.Internal.Machine.RotationKey);
rowItem.Control = item.ReadString(Models.Internal.Machine.ControlKey);
rowItem.Status = item.ReadString(Models.Internal.Machine.StatusKey);
rowItem.DisplayCount = item.ReadString(Models.Internal.Machine.DisplayCountKey);
rowItem.DisplayType = item.ReadString(Models.Internal.Machine.DisplayTypeKey);
rowItem.Extra = item.ReadString(Models.Internal.Machine.ExtraKey);
rowItem.Buttons = item.ReadString(Models.Internal.Machine.ButtonsKey);
rowItem.Favorite = item.ReadString(Models.Internal.Machine.FavoriteKey);
rowItem.Tags = item.ReadString(Models.Internal.Machine.TagsKey);
rowItem.PlayedCount = item.ReadString(Models.Internal.Machine.PlayedCountKey);
rowItem.PlayedTime = item.ReadString(Models.Internal.Machine.PlayedTimeKey);
return rowItem;
})?.ToArray();
} }
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Rom"/> to <cref="Models.AttractMode.Row"/> /// Convert from <cref="Models.Internal.Rom"/> to <cref="Models.AttractMode.Row"/>
/// </summary> /// </summary>
private static Row? ConvertFromInternalModel(Models.Internal.Rom? item) private static Row ConvertFromInternalModel(Models.Internal.Rom item, Models.Internal.Machine parent)
{ {
if (item == null)
return null;
var row = new Row var row = new Row
{ {
Name = parent.ReadString(Models.Internal.Machine.NameKey),
Title = item.ReadString(Models.Internal.Rom.NameKey), Title = item.ReadString(Models.Internal.Rom.NameKey),
Emulator = parent.ReadString(Models.Internal.Machine.EmulatorKey),
CloneOf = parent.ReadString(Models.Internal.Machine.CloneOfKey),
Year = parent.ReadString(Models.Internal.Machine.YearKey),
Manufacturer = parent.ReadString(Models.Internal.Machine.ManufacturerKey),
Category = parent.ReadString(Models.Internal.Machine.CategoryKey),
Players = parent.ReadString(Models.Internal.Machine.PlayersKey),
Rotation = parent.ReadString(Models.Internal.Machine.RotationKey),
Control = parent.ReadString(Models.Internal.Machine.ControlKey),
Status = parent.ReadString(Models.Internal.Machine.StatusKey),
DisplayCount = parent.ReadString(Models.Internal.Machine.DisplayCountKey),
DisplayType = parent.ReadString(Models.Internal.Machine.DisplayTypeKey),
AltRomname = item.ReadString(Models.Internal.Rom.AltRomnameKey), AltRomname = item.ReadString(Models.Internal.Rom.AltRomnameKey),
AltTitle = item.ReadString(Models.Internal.Rom.AltTitleKey), AltTitle = item.ReadString(Models.Internal.Rom.AltTitleKey),
Extra = parent.ReadString(Models.Internal.Machine.ExtraKey),
Buttons = parent.ReadString(Models.Internal.Machine.ButtonsKey),
Favorite = parent.ReadString(Models.Internal.Machine.FavoriteKey),
Tags = parent.ReadString(Models.Internal.Machine.TagsKey),
PlayedCount = parent.ReadString(Models.Internal.Machine.PlayedCountKey),
PlayedTime = parent.ReadString(Models.Internal.Machine.PlayedTimeKey),
FileIsAvailable = item.ReadString(Models.Internal.Rom.FileIsAvailableKey), FileIsAvailable = item.ReadString(Models.Internal.Rom.FileIsAvailableKey),
}; };
return row; return row;

View File

@@ -105,15 +105,23 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.AttractMode.MetadataFile"/> to <cref="Models.Internal.MetadataFile"/> /// Convert from <cref="Models.AttractMode.MetadataFile"/> to <cref="Models.Internal.MetadataFile"/>
/// </summary> /// </summary>
public static Models.Internal.MetadataFile ConvertToInternalModel(MetadataFile item) public static Models.Internal.MetadataFile? ConvertToInternalModel(MetadataFile? item)
{ {
if (item == null)
return null;
var metadataFile = new Models.Internal.MetadataFile var metadataFile = new Models.Internal.MetadataFile
{ {
[Models.Internal.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item), [Models.Internal.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item),
}; };
if (item?.Row != null && item.Row.Any()) if (item?.Row != null && item.Row.Any())
metadataFile[Models.Internal.MetadataFile.MachineKey] = item.Row.Select(ConvertMachineToInternalModel).ToArray(); {
metadataFile[Models.Internal.MetadataFile.MachineKey] = item.Row
.Where(r => r != null)
.Select(ConvertMachineToInternalModel)
.ToArray();
}
return metadataFile; return metadataFile;
} }

View File

@@ -53,6 +53,7 @@ namespace SabreTools.Serialization
var samples = new List<Sample>(); var samples = new List<Sample>();
var archives = new List<Archive>(); var archives = new List<Archive>();
var chips = new List<Chip>(); var chips = new List<Chip>();
var videos = new List<Video>();
var dipSwitches = new List<DipSwitch>(); var dipSwitches = new List<DipSwitch>();
var additional = new List<string>(); var additional = new List<string>();
@@ -89,6 +90,7 @@ namespace SabreTools.Serialization
game.Sample = samples.ToArray(); game.Sample = samples.ToArray();
game.Archive = archives.ToArray(); game.Archive = archives.ToArray();
game.Chip = chips.ToArray(); game.Chip = chips.ToArray();
game.Video = videos.ToArray();
game.DipSwitch = dipSwitches.ToArray(); game.DipSwitch = dipSwitches.ToArray();
game.ADDITIONAL_ELEMENTS = gameAdditional.ToArray(); game.ADDITIONAL_ELEMENTS = gameAdditional.ToArray();
@@ -103,6 +105,7 @@ namespace SabreTools.Serialization
samples.Clear(); samples.Clear();
archives.Clear(); archives.Clear();
chips.Clear(); chips.Clear();
videos.Clear();
dipSwitches.Clear(); dipSwitches.Clear();
gameAdditional.Clear(); gameAdditional.Clear();
break; break;
@@ -293,7 +296,7 @@ namespace SabreTools.Serialization
chips.Add(CreateChip(reader)); chips.Add(CreateChip(reader));
break; break;
case "video": case "video":
game.Video = CreateVideo(reader); videos.Add(CreateVideo(reader));
break; break;
case "sound": case "sound":
game.Sound = CreateSound(reader); game.Sound = CreateSound(reader);
@@ -848,7 +851,12 @@ namespace SabreTools.Serialization
var machines = item.Read<Models.Internal.Machine[]>(Models.Internal.MetadataFile.MachineKey); var machines = item.Read<Models.Internal.Machine[]>(Models.Internal.MetadataFile.MachineKey);
if (machines != null && machines.Any()) if (machines != null && machines.Any())
metadataFile.Game = machines.Select(machine => ConvertMachineFromInternalModel(machine, game)).ToArray(); {
metadataFile.Game = machines
.Where(m => m != null)
.Select(machine => ConvertMachineFromInternalModel(machine, game))
.ToArray();
}
return metadataFile; return metadataFile;
} }
@@ -856,11 +864,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Header"/> to <cref="Models.ClrMamePro.ClrMamePro"/> /// Convert from <cref="Models.Internal.Header"/> to <cref="Models.ClrMamePro.ClrMamePro"/>
/// </summary> /// </summary>
private static Models.ClrMamePro.ClrMamePro? ConvertHeaderFromInternalModel(Models.Internal.Header? item) private static Models.ClrMamePro.ClrMamePro ConvertHeaderFromInternalModel(Models.Internal.Header item)
{ {
if (item == null)
return null;
var clrMamePro = new Models.ClrMamePro.ClrMamePro var clrMamePro = new Models.ClrMamePro.ClrMamePro
{ {
Name = item.ReadString(Models.Internal.Header.NameKey), Name = item.ReadString(Models.Internal.Header.NameKey),
@@ -885,11 +890,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Archive"/> to <cref="Models.ClrMamePro.Machine"/> /// Convert from <cref="Models.Internal.Archive"/> to <cref="Models.ClrMamePro.Machine"/>
/// </summary> /// </summary>
private static GameBase? ConvertMachineFromInternalModel(Models.Internal.Machine? item, bool game = false) private static GameBase ConvertMachineFromInternalModel(Models.Internal.Machine item, bool game = false)
{ {
if (item == null)
return null;
GameBase gameBase = game ? new Models.ClrMamePro.Game() : new Models.ClrMamePro.Machine(); GameBase gameBase = game ? new Models.ClrMamePro.Game() : new Models.ClrMamePro.Machine();
gameBase.Name = item.ReadString(Models.Internal.Machine.NameKey); gameBase.Name = item.ReadString(Models.Internal.Machine.NameKey);
@@ -902,43 +904,106 @@ namespace SabreTools.Serialization
gameBase.SampleOf = item.ReadString(Models.Internal.Machine.SampleOfKey); gameBase.SampleOf = item.ReadString(Models.Internal.Machine.SampleOfKey);
var releases = item.Read<Models.Internal.Release[]>(Models.Internal.Machine.ReleaseKey); var releases = item.Read<Models.Internal.Release[]>(Models.Internal.Machine.ReleaseKey);
gameBase.Release = releases?.Select(ConvertFromInternalModel)?.ToArray(); if (releases != null && releases.Any())
{
gameBase.Release = releases
.Where(r => r != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
var biosSets = item.Read<Models.Internal.BiosSet[]>(Models.Internal.Machine.BiosSetKey); var biosSets = item.Read<Models.Internal.BiosSet[]>(Models.Internal.Machine.BiosSetKey);
gameBase.BiosSet = biosSets?.Select(ConvertFromInternalModel)?.ToArray(); if (biosSets != null && biosSets.Any())
{
gameBase.BiosSet = biosSets
.Where(r => r != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
var roms = item.Read<Models.Internal.Rom[]>(Models.Internal.Machine.RomKey); var roms = item.Read<Models.Internal.Rom[]>(Models.Internal.Machine.RomKey);
gameBase.Rom = roms?.Select(ConvertFromInternalModel)?.ToArray(); if (roms != null && roms.Any())
{
gameBase.Rom = roms
.Where(r => r != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
var disks = item.Read<Models.Internal.Disk[]>(Models.Internal.Machine.DiskKey); var disks = item.Read<Models.Internal.Disk[]>(Models.Internal.Machine.DiskKey);
gameBase.Disk = disks?.Select(ConvertFromInternalModel)?.ToArray(); if (disks != null && disks.Any())
{
gameBase.Disk = disks
.Where(d => d != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
var medias = item.Read<Models.Internal.Media[]>(Models.Internal.Machine.MediaKey); var medias = item.Read<Models.Internal.Media[]>(Models.Internal.Machine.MediaKey);
gameBase.Media = medias?.Select(ConvertFromInternalModel)?.ToArray(); if (medias != null && medias.Any())
{
gameBase.Media = medias
.Where(m => m != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
var samples = item.Read<Models.Internal.Sample[]>(Models.Internal.Machine.SampleKey); var samples = item.Read<Models.Internal.Sample[]>(Models.Internal.Machine.SampleKey);
gameBase.Sample = samples?.Select(ConvertFromInternalModel)?.ToArray(); if (samples != null && samples.Any())
{
gameBase.Sample = samples
.Where(m => m != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
var archives = item.Read<Models.Internal.Archive[]>(Models.Internal.Machine.ArchiveKey); var archives = item.Read<Models.Internal.Archive[]>(Models.Internal.Machine.ArchiveKey);
gameBase.Archive = archives?.Select(ConvertFromInternalModel)?.ToArray(); if (archives != null && archives.Any())
{
gameBase.Archive = archives
.Where(m => m != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
var chips = item.Read<Models.Internal.Chip[]>(Models.Internal.Machine.ChipKey); var chips = item.Read<Models.Internal.Chip[]>(Models.Internal.Machine.ChipKey);
gameBase.Chip = chips?.Select(ConvertFromInternalModel)?.ToArray(); if (chips != null && chips.Any())
{
gameBase.Chip = chips
.Where(m => m != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
var video = item.Read<Models.Internal.Video>(Models.Internal.Machine.VideoKey); var videos = item.Read<Models.Internal.Video[]>(Models.Internal.Machine.VideoKey);
gameBase.Video = ConvertFromInternalModel(video); if (videos != null && videos.Any())
{
gameBase.Video = videos
.Where(m => m != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
var sound = item.Read<Models.Internal.Sound>(Models.Internal.Machine.SoundKey); var sound = item.Read<Models.Internal.Sound>(Models.Internal.Machine.SoundKey);
gameBase.Sound = ConvertFromInternalModel(sound); if (sound != null)
gameBase.Sound = ConvertFromInternalModel(sound);
var input = item.Read<Models.Internal.Input>(Models.Internal.Machine.InputKey); var input = item.Read<Models.Internal.Input>(Models.Internal.Machine.InputKey);
gameBase.Input = ConvertFromInternalModel(input); if (input != null)
gameBase.Input = ConvertFromInternalModel(input);
var dipSwitches = item.Read<Models.Internal.DipSwitch[]>(Models.Internal.Machine.DipSwitchKey); var dipSwitches = item.Read<Models.Internal.DipSwitch[]>(Models.Internal.Machine.DipSwitchKey);
gameBase.DipSwitch = dipSwitches?.Select(ConvertFromInternalModel)?.ToArray(); if (dipSwitches != null && dipSwitches.Any())
{
gameBase.DipSwitch = dipSwitches
.Where(m => m != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
var driver = item.Read<Models.Internal.Driver>(Models.Internal.Machine.DriverKey); var driver = item.Read<Models.Internal.Driver>(Models.Internal.Machine.DriverKey);
gameBase.Driver = ConvertFromInternalModel(driver); if (driver != null)
gameBase.Driver = ConvertFromInternalModel(driver);
return gameBase; return gameBase;
} }
@@ -946,11 +1011,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Archive"/> to <cref="Models.ClrMamePro.Archive"/> /// Convert from <cref="Models.Internal.Archive"/> to <cref="Models.ClrMamePro.Archive"/>
/// </summary> /// </summary>
private static Archive? ConvertFromInternalModel(Models.Internal.Archive? item) private static Archive ConvertFromInternalModel(Models.Internal.Archive item)
{ {
if (item == null)
return null;
var archive = new Archive var archive = new Archive
{ {
Name = item.ReadString(Models.Internal.Archive.NameKey), Name = item.ReadString(Models.Internal.Archive.NameKey),
@@ -961,11 +1023,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.BiosSet"/> to <cref="Models.ClrMamePro.BiosSet"/> /// Convert from <cref="Models.Internal.BiosSet"/> to <cref="Models.ClrMamePro.BiosSet"/>
/// </summary> /// </summary>
private static BiosSet? ConvertFromInternalModel(Models.Internal.BiosSet? item) private static BiosSet ConvertFromInternalModel(Models.Internal.BiosSet item)
{ {
if (item == null)
return null;
var biosset = new BiosSet var biosset = new BiosSet
{ {
Name = item.ReadString(Models.Internal.BiosSet.NameKey), Name = item.ReadString(Models.Internal.BiosSet.NameKey),
@@ -978,11 +1037,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Chip"/> to <cref="Models.ClrMamePro.Chip"/> /// Convert from <cref="Models.Internal.Chip"/> to <cref="Models.ClrMamePro.Chip"/>
/// </summary> /// </summary>
private static Chip? ConvertFromInternalModel(Models.Internal.Chip? item) private static Chip ConvertFromInternalModel(Models.Internal.Chip item)
{ {
if (item == null)
return null;
var chip = new Chip var chip = new Chip
{ {
Type = item.ReadString(Models.Internal.Chip.ChipTypeKey), Type = item.ReadString(Models.Internal.Chip.ChipTypeKey),
@@ -996,11 +1052,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.DipSwitch"/> to <cref="Models.ClrMamePro.DipSwitch"/> /// Convert from <cref="Models.Internal.DipSwitch"/> to <cref="Models.ClrMamePro.DipSwitch"/>
/// </summary> /// </summary>
private static DipSwitch? ConvertFromInternalModel(Models.Internal.DipSwitch? item) private static DipSwitch ConvertFromInternalModel(Models.Internal.DipSwitch item)
{ {
if (item == null)
return null;
var dipswitch = new DipSwitch var dipswitch = new DipSwitch
{ {
Name = item.ReadString(Models.Internal.DipSwitch.NameKey), Name = item.ReadString(Models.Internal.DipSwitch.NameKey),
@@ -1013,11 +1066,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Disk"/> to <cref="Models.ClrMamePro.Disk"/> /// Convert from <cref="Models.Internal.Disk"/> to <cref="Models.ClrMamePro.Disk"/>
/// </summary> /// </summary>
private static Disk? ConvertFromInternalModel(Models.Internal.Disk? item) private static Disk ConvertFromInternalModel(Models.Internal.Disk item)
{ {
if (item == null)
return null;
var disk = new Disk var disk = new Disk
{ {
Name = item.ReadString(Models.Internal.Disk.NameKey), Name = item.ReadString(Models.Internal.Disk.NameKey),
@@ -1033,11 +1083,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Driver"/> to <cref="Models.ClrMamePro.Driver"/> /// Convert from <cref="Models.Internal.Driver"/> to <cref="Models.ClrMamePro.Driver"/>
/// </summary> /// </summary>
private static Driver? ConvertFromInternalModel(Models.Internal.Driver? item) private static Driver ConvertFromInternalModel(Models.Internal.Driver item)
{ {
if (item == null)
return null;
var driver = new Driver var driver = new Driver
{ {
Status = item.ReadString(Models.Internal.Driver.StatusKey), Status = item.ReadString(Models.Internal.Driver.StatusKey),
@@ -1052,11 +1099,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Input"/> to <cref="Models.ClrMamePro.Input"/> /// Convert from <cref="Models.Internal.Input"/> to <cref="Models.ClrMamePro.Input"/>
/// </summary> /// </summary>
private static Input? ConvertFromInternalModel(Models.Internal.Input? item) private static Input ConvertFromInternalModel(Models.Internal.Input item)
{ {
if (item == null)
return null;
var input = new Input var input = new Input
{ {
Players = item.ReadString(Models.Internal.Input.PlayersKey), Players = item.ReadString(Models.Internal.Input.PlayersKey),
@@ -1072,11 +1116,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Media"/> to <cref="Models.ClrMamePro.Media"/> /// Convert from <cref="Models.Internal.Media"/> to <cref="Models.ClrMamePro.Media"/>
/// </summary> /// </summary>
private static Media? ConvertFromInternalModel(Models.Internal.Media? item) private static Media ConvertFromInternalModel(Models.Internal.Media item)
{ {
if (item == null)
return null;
var media = new Media var media = new Media
{ {
Name = item.ReadString(Models.Internal.Media.NameKey), Name = item.ReadString(Models.Internal.Media.NameKey),
@@ -1091,11 +1132,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Release"/> to <cref="Models.ClrMamePro.Release"/> /// Convert from <cref="Models.Internal.Release"/> to <cref="Models.ClrMamePro.Release"/>
/// </summary> /// </summary>
private static Release? ConvertFromInternalModel(Models.Internal.Release? item) private static Release ConvertFromInternalModel(Models.Internal.Release item)
{ {
if (item == null)
return null;
var release = new Release var release = new Release
{ {
Name = item.ReadString(Models.Internal.Release.NameKey), Name = item.ReadString(Models.Internal.Release.NameKey),
@@ -1110,11 +1148,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Rom"/> to <cref="Models.ClrMamePro.Rom"/> /// Convert from <cref="Models.Internal.Rom"/> to <cref="Models.ClrMamePro.Rom"/>
/// </summary> /// </summary>
private static Rom? ConvertFromInternalModel(Models.Internal.Rom? item) private static Rom ConvertFromInternalModel(Models.Internal.Rom item)
{ {
if (item == null)
return null;
var rom = new Rom var rom = new Rom
{ {
Name = item.ReadString(Models.Internal.Rom.NameKey), Name = item.ReadString(Models.Internal.Rom.NameKey),
@@ -1145,11 +1180,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Sample"/> to <cref="Models.ClrMamePro.Sample"/> /// Convert from <cref="Models.Internal.Sample"/> to <cref="Models.ClrMamePro.Sample"/>
/// </summary> /// </summary>
private static Sample? ConvertFromInternalModel(Models.Internal.Sample? item) private static Sample ConvertFromInternalModel(Models.Internal.Sample item)
{ {
if (item == null)
return null;
var sample = new Sample var sample = new Sample
{ {
Name = item.ReadString(Models.Internal.Sample.NameKey), Name = item.ReadString(Models.Internal.Sample.NameKey),
@@ -1160,11 +1192,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Sound"/> to <cref="Models.ClrMamePro.Sound"/> /// Convert from <cref="Models.Internal.Sound"/> to <cref="Models.ClrMamePro.Sound"/>
/// </summary> /// </summary>
private static Sound? ConvertFromInternalModel(Models.Internal.Sound? item) private static Sound ConvertFromInternalModel(Models.Internal.Sound item)
{ {
if (item == null)
return null;
var sound = new Sound var sound = new Sound
{ {
Channels = item.ReadString(Models.Internal.Sound.ChannelsKey), Channels = item.ReadString(Models.Internal.Sound.ChannelsKey),
@@ -1175,11 +1204,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Video"/> to <cref="Models.ClrMamePro.Video"/> /// Convert from <cref="Models.Internal.Video"/> to <cref="Models.ClrMamePro.Video"/>
/// </summary> /// </summary>
private static Video? ConvertFromInternalModel(Models.Internal.Video? item) private static Video ConvertFromInternalModel(Models.Internal.Video item)
{ {
if (item == null)
return null;
var video = new Video var video = new Video
{ {
Screen = item.ReadString(Models.Internal.Video.ScreenKey), Screen = item.ReadString(Models.Internal.Video.ScreenKey),

View File

@@ -4,6 +4,7 @@ using System.Linq;
using System.Text; using System.Text;
using SabreTools.IO.Writers; using SabreTools.IO.Writers;
using SabreTools.Models.ClrMamePro; using SabreTools.Models.ClrMamePro;
namespace SabreTools.Serialization namespace SabreTools.Serialization
{ {
/// <summary> /// <summary>
@@ -154,7 +155,7 @@ namespace SabreTools.Serialization
WriteSamples(game.Sample, writer); WriteSamples(game.Sample, writer);
WriteArchives(game.Archive, writer); WriteArchives(game.Archive, writer);
WriteChips(game.Chip, writer); WriteChips(game.Chip, writer);
WriteVideo(game.Video, writer); WriteVideos(game.Video, writer);
WriteSound(game.Sound, writer); WriteSound(game.Sound, writer);
WriteInput(game.Input, writer); WriteInput(game.Input, writer);
WriteDipSwitches(game.DipSwitch, writer); WriteDipSwitches(game.DipSwitch, writer);
@@ -356,23 +357,26 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Write video information to the current writer /// Write video information to the current writer
/// </summary> /// </summary>
/// <param name="video">Video object to write</param> /// <param name="videos">Array of Video objects to write</param>
/// <param name="writer">ClrMameProWriter representing the output</param> /// <param name="writer">ClrMameProWriter representing the output</param>
private static void WriteVideo(Video? video, ClrMameProWriter writer) private static void WriteVideos(Video[]? videos, ClrMameProWriter writer)
{ {
// If the item is missing, we can't do anything // If the item is missing, we can't do anything
if (video == null) if (videos == null)
return; return;
writer.WriteStartElement("video"); foreach (var video in videos)
writer.WriteRequiredAttributeString("screen", video.Screen, throwOnError: true); {
writer.WriteRequiredAttributeString("orientation", video.Orientation, throwOnError: true); writer.WriteStartElement("video");
writer.WriteOptionalAttributeString("x", video.X); writer.WriteRequiredAttributeString("screen", video.Screen, throwOnError: true);
writer.WriteOptionalAttributeString("y", video.Y); writer.WriteRequiredAttributeString("orientation", video.Orientation, throwOnError: true);
writer.WriteOptionalAttributeString("aspectx", video.AspectX); writer.WriteOptionalAttributeString("x", video.X);
writer.WriteOptionalAttributeString("aspecty", video.AspectY); writer.WriteOptionalAttributeString("y", video.Y);
writer.WriteOptionalAttributeString("freq", video.Freq); writer.WriteOptionalAttributeString("aspectx", video.AspectX);
writer.WriteEndElement(); // video writer.WriteOptionalAttributeString("aspecty", video.AspectY);
writer.WriteOptionalAttributeString("freq", video.Freq);
writer.WriteEndElement(); // video
}
} }
/// <summary> /// <summary>
@@ -461,15 +465,23 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.ClrMamePro.MetadataFile"/> to <cref="Models.Internal.MetadataFile"/> /// Convert from <cref="Models.ClrMamePro.MetadataFile"/> to <cref="Models.Internal.MetadataFile"/>
/// </summary> /// </summary>
public static Models.Internal.MetadataFile ConvertToInternalModel(MetadataFile item) public static Models.Internal.MetadataFile? ConvertToInternalModel(MetadataFile? item)
{ {
if (item == null)
return null;
var metadataFile = new Models.Internal.MetadataFile(); var metadataFile = new Models.Internal.MetadataFile();
if (item?.ClrMamePro != null) if (item?.ClrMamePro != null)
metadataFile[Models.Internal.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item.ClrMamePro); metadataFile[Models.Internal.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item.ClrMamePro);
if (item?.Game != null && item.Game.Any()) if (item?.Game != null && item.Game.Any())
metadataFile[Models.Internal.MetadataFile.MachineKey] = item.Game.Select(ConvertMachineToInternalModel).ToArray(); {
metadataFile[Models.Internal.MetadataFile.MachineKey] = item.Game
.Where(g => g != null)
.Select(ConvertMachineToInternalModel)
.ToArray();
}
return metadataFile; return metadataFile;
} }
@@ -518,31 +530,76 @@ namespace SabreTools.Serialization
}; };
if (item.Release != null && item.Release.Any()) if (item.Release != null && item.Release.Any())
machine[Models.Internal.Machine.ReleaseKey] = item.Release?.Select(ConvertToInternalModel)?.ToArray(); {
machine[Models.Internal.Machine.ReleaseKey] = item.Release
.Where(r => r != null)
.Select(ConvertToInternalModel)
.ToArray();
}
if (item.BiosSet != null && item.BiosSet.Any()) if (item.BiosSet != null && item.BiosSet.Any())
machine[Models.Internal.Machine.BiosSetKey] = item.BiosSet?.Select(ConvertToInternalModel)?.ToArray(); {
machine[Models.Internal.Machine.BiosSetKey] = item.BiosSet
.Where(b => b != null)
.Select(ConvertToInternalModel)
.ToArray();
}
if (item.Rom != null && item.Rom.Any()) if (item.Rom != null && item.Rom.Any())
machine[Models.Internal.Machine.RomKey] = item.Rom?.Select(ConvertToInternalModel)?.ToArray(); {
machine[Models.Internal.Machine.RomKey] = item.Rom
.Where(r => r != null)
.Select(ConvertToInternalModel)
.ToArray();
}
if (item.Disk != null && item.Disk.Any()) if (item.Disk != null && item.Disk.Any())
machine[Models.Internal.Machine.DiskKey] = item.Disk?.Select(ConvertToInternalModel)?.ToArray(); {
machine[Models.Internal.Machine.DiskKey] = item.Disk
.Where(d => d != null)
.Select(ConvertToInternalModel)
.ToArray();
}
if (item.Media != null && item.Media.Any()) if (item.Media != null && item.Media.Any())
machine[Models.Internal.Machine.MediaKey] = item.Media?.Select(ConvertToInternalModel)?.ToArray(); {
machine[Models.Internal.Machine.MediaKey] = item.Media
.Where(m => m != null)
.Select(ConvertToInternalModel)
.ToArray();
}
if (item.Sample != null && item.Sample.Any()) if (item.Sample != null && item.Sample.Any())
machine[Models.Internal.Machine.SampleKey] = item.Sample?.Select(ConvertToInternalModel)?.ToArray(); {
machine[Models.Internal.Machine.SampleKey] = item.Sample
.Where(s => s != null)
.Select(ConvertToInternalModel)
.ToArray();
}
if (item.Archive != null && item.Archive.Any()) if (item.Archive != null && item.Archive.Any())
machine[Models.Internal.Machine.ArchiveKey] = item.Archive?.Select(ConvertToInternalModel)?.ToArray(); {
machine[Models.Internal.Machine.ArchiveKey] = item.Archive
.Where(a => a != null)
.Select(ConvertToInternalModel)
.ToArray();
}
if (item.Chip != null && item.Chip.Any()) if (item.Chip != null && item.Chip.Any())
machine[Models.Internal.Machine.ChipKey] = item.Chip?.Select(ConvertToInternalModel)?.ToArray(); {
machine[Models.Internal.Machine.ChipKey] = item.Chip
.Where(c => c != null)
.Select(ConvertToInternalModel)
.ToArray();
}
if (item.Video != null) if (item.Video != null)
machine[Models.Internal.Machine.VideoKey] = ConvertToInternalModel(item.Video); {
machine[Models.Internal.Machine.VideoKey] = item.Video
.Where(v => v != null)
.Select(ConvertToInternalModel)
.ToArray();
}
if (item.Sound != null) if (item.Sound != null)
machine[Models.Internal.Machine.SoundKey] = ConvertToInternalModel(item.Sound); machine[Models.Internal.Machine.SoundKey] = ConvertToInternalModel(item.Sound);
@@ -551,7 +608,12 @@ namespace SabreTools.Serialization
machine[Models.Internal.Machine.InputKey] = ConvertToInternalModel(item.Input); machine[Models.Internal.Machine.InputKey] = ConvertToInternalModel(item.Input);
if (item.DipSwitch != null && item.DipSwitch.Any()) if (item.DipSwitch != null && item.DipSwitch.Any())
machine[Models.Internal.Machine.DipSwitchKey] = item.DipSwitch?.Select(ConvertToInternalModel)?.ToArray(); {
machine[Models.Internal.Machine.DipSwitchKey] = item.DipSwitch
.Where(d => d != null)
.Select(ConvertToInternalModel)
.ToArray();
}
if (item.Driver != null) if (item.Driver != null)
machine[Models.Internal.Machine.DriverKey] = ConvertToInternalModel(item.Driver); machine[Models.Internal.Machine.DriverKey] = ConvertToInternalModel(item.Driver);

View File

@@ -234,7 +234,12 @@ namespace SabreTools.Serialization
var machines = item.Read<Models.Internal.Machine[]>(Models.Internal.MetadataFile.MachineKey); var machines = item.Read<Models.Internal.Machine[]>(Models.Internal.MetadataFile.MachineKey);
if (machines != null && machines.Any()) if (machines != null && machines.Any())
metadataFile.Game = machines.Select(ConvertMachineFromInternalModel).ToArray(); {
metadataFile.Game = machines
.Where(m => m != null)
.Select(ConvertMachineFromInternalModel)
.ToArray();
}
return metadataFile; return metadataFile;
} }
@@ -242,11 +247,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Header"/> to <cref="Models.DosCenter.DosCenter"/> /// Convert from <cref="Models.Internal.Header"/> to <cref="Models.DosCenter.DosCenter"/>
/// </summary> /// </summary>
private static Models.DosCenter.DosCenter? ConvertHeaderFromInternalModel(Models.Internal.Header? item) private static Models.DosCenter.DosCenter ConvertHeaderFromInternalModel(Models.Internal.Header item)
{ {
if (item == null)
return null;
var dosCenter = new Models.DosCenter.DosCenter var dosCenter = new Models.DosCenter.DosCenter
{ {
Name = item.ReadString(Models.Internal.Header.NameKey), Name = item.ReadString(Models.Internal.Header.NameKey),
@@ -263,18 +265,21 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Machine"/> to <cref="Models.DosCenter.Game"/> /// Convert from <cref="Models.Internal.Machine"/> to <cref="Models.DosCenter.Game"/>
/// </summary> /// </summary>
private static Game? ConvertMachineFromInternalModel(Models.Internal.Machine? item) private static Game ConvertMachineFromInternalModel(Models.Internal.Machine item)
{ {
if (item == null)
return null;
var game = new Game var game = new Game
{ {
Name = item.ReadString(Models.Internal.Machine.NameKey), Name = item.ReadString(Models.Internal.Machine.NameKey),
}; };
var roms = item.Read<Models.Internal.Rom[]>(Models.Internal.Machine.RomKey); var roms = item.Read<Models.Internal.Rom[]>(Models.Internal.Machine.RomKey);
game.File = roms?.Select(ConvertFromInternalModel)?.ToArray(); if (roms != null && roms.Any())
{
game.File = roms
.Where(r => r != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
return game; return game;
} }
@@ -282,11 +287,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Rom"/> to <cref="Models.DosCenter.File"/> /// Convert from <cref="Models.Internal.Rom"/> to <cref="Models.DosCenter.File"/>
/// </summary> /// </summary>
private static Models.DosCenter.File? ConvertFromInternalModel(Models.Internal.Rom? item) private static Models.DosCenter.File ConvertFromInternalModel(Models.Internal.Rom item)
{ {
if (item == null)
return null;
var file = new Models.DosCenter.File var file = new Models.DosCenter.File
{ {
Name = item.ReadString(Models.Internal.Rom.NameKey), Name = item.ReadString(Models.Internal.Rom.NameKey),

View File

@@ -151,15 +151,23 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.DosCenter.MetadataFile"/> to <cref="Models.Internal.MetadataFile"/> /// Convert from <cref="Models.DosCenter.MetadataFile"/> to <cref="Models.Internal.MetadataFile"/>
/// </summary> /// </summary>
public static Models.Internal.MetadataFile ConvertToInternalModel(MetadataFile item) public static Models.Internal.MetadataFile? ConvertToInternalModel(MetadataFile? item)
{ {
if (item == null)
return null;
var metadataFile = new Models.Internal.MetadataFile(); var metadataFile = new Models.Internal.MetadataFile();
if (item?.DosCenter != null) if (item?.DosCenter != null)
metadataFile[Models.Internal.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item.DosCenter); metadataFile[Models.Internal.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item.DosCenter);
if (item?.Game != null && item.Game.Any()) if (item?.Game != null && item.Game.Any())
metadataFile[Models.Internal.MetadataFile.MachineKey] = item.Game.Select(ConvertMachineToInternalModel).ToArray(); {
metadataFile[Models.Internal.MetadataFile.MachineKey] = item.Game
.Where(g => g != null)
.Select(ConvertMachineToInternalModel)
.ToArray();
}
return metadataFile; return metadataFile;
} }
@@ -193,7 +201,12 @@ namespace SabreTools.Serialization
}; };
if (item.File != null && item.File.Any()) if (item.File != null && item.File.Any())
machine[Models.Internal.Machine.RomKey] = item.File.Select(ConvertToInternalModel).ToArray(); {
machine[Models.Internal.Machine.RomKey] = item.File
.Where(f => f != null)
.Select(ConvertToInternalModel)
.ToArray();
}
return machine; return machine;
} }

View File

@@ -1,3 +1,4 @@
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
@@ -91,7 +92,12 @@ namespace SabreTools.Serialization
var machines = item.Read<Models.Internal.Machine[]>(Models.Internal.MetadataFile.MachineKey); var machines = item.Read<Models.Internal.Machine[]>(Models.Internal.MetadataFile.MachineKey);
if (machines != null && machines.Any()) if (machines != null && machines.Any())
metadataFile.Row = machines.SelectMany(ConvertMachineFromInternalModel).ToArray(); {
metadataFile.Row = machines
.Where(m => m != null)
.SelectMany(ConvertMachineFromInternalModel)
.ToArray();
}
return metadataFile; return metadataFile;
} }
@@ -99,23 +105,23 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Machine"/> to an array of <cref="Models.EverdriveSMDB.Row"/> /// Convert from <cref="Models.Internal.Machine"/> to an array of <cref="Models.EverdriveSMDB.Row"/>
/// </summary> /// </summary>
private static Row[]? ConvertMachineFromInternalModel(Models.Internal.Machine item) private static Row[] ConvertMachineFromInternalModel(Models.Internal.Machine item)
{ {
if (item == null)
return null;
var roms = item.Read<Models.Internal.Rom[]>(Models.Internal.Machine.RomKey); var roms = item.Read<Models.Internal.Rom[]>(Models.Internal.Machine.RomKey);
return roms?.Select(ConvertFromInternalModel)?.ToArray(); if (roms == null || !roms.Any())
return Array.Empty<Row>();
return roms
.Where(r => r != null)
.Select(ConvertFromInternalModel)
.ToArray();
} }
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Rom"/> to <cref="Models.EverdriveSMDB.Row"/> /// Convert from <cref="Models.Internal.Rom"/> to <cref="Models.EverdriveSMDB.Row"/>
/// </summary> /// </summary>
private static Row? ConvertFromInternalModel(Models.Internal.Rom? item) private static Row ConvertFromInternalModel(Models.Internal.Rom item)
{ {
if (item == null)
return null;
var row = new Row var row = new Row
{ {
SHA256 = item.ReadString(Models.Internal.Rom.SHA256Key), SHA256 = item.ReadString(Models.Internal.Rom.SHA256Key),

View File

@@ -88,15 +88,23 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.EverdriveSMDB.MetadataFile"/> to <cref="Models.Internal.MetadataFile"/> /// Convert from <cref="Models.EverdriveSMDB.MetadataFile"/> to <cref="Models.Internal.MetadataFile"/>
/// </summary> /// </summary>
public static Models.Internal.MetadataFile ConvertToInternalModel(MetadataFile item) public static Models.Internal.MetadataFile? ConvertToInternalModel(MetadataFile? item)
{ {
if (item == null)
return null;
var metadataFile = new Models.Internal.MetadataFile var metadataFile = new Models.Internal.MetadataFile
{ {
[Models.Internal.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item), [Models.Internal.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item),
}; };
if (item?.Row != null && item.Row.Any()) if (item?.Row != null && item.Row.Any())
metadataFile[Models.Internal.MetadataFile.MachineKey] = item.Row.Select(ConvertMachineToInternalModel).ToArray(); {
metadataFile[Models.Internal.MetadataFile.MachineKey] = item.Row
.Where(r => r != null)
.Select(ConvertMachineToInternalModel)
.ToArray();
}
return metadataFile; return metadataFile;
} }

View File

@@ -147,14 +147,82 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.MetadataFile"/> to an array of <cref="Models.Hashfile.Hashfile"/> /// Convert from <cref="Models.Internal.MetadataFile"/> to an array of <cref="Models.Hashfile.Hashfile"/>
/// </summary> /// </summary>
public static Models.Hashfile.Hashfile[]? ConvertFromInternalModel(Models.Internal.MetadataFile? item, Hash hash) /// <remarks>TODO: Add machine name prefixes to all items</remarks>
public static Models.Hashfile.Hashfile? ConvertFromInternalModel(Models.Internal.MetadataFile? item, Hash hash)
{
if (item == null)
return null;
var machines = item.Read<Models.Internal.Machine[]>(Models.Internal.MetadataFile.MachineKey);
if (machines == null || !machines.Any())
return null;
var hashfiles = machines
.Where(m => m != null)
.Select(machine => ConvertMachineFromInternalModel(machine, hash));
var sfvs = new List<SFV>();
var md5s = new List<MD5>();
var sha1s = new List<SHA1>();
var sha256s = new List<SHA256>();
var sha384s = new List<SHA384>();
var sha512s = new List<SHA512>();
var spamsums = new List<SpamSum>();
foreach (var hashfile in hashfiles)
{
if (hashfile.SFV != null && hashfile.SFV.Any())
sfvs.AddRange(hashfile.SFV);
if (hashfile.MD5 != null && hashfile.MD5.Any())
md5s.AddRange(hashfile.MD5);
if (hashfile.SHA1 != null && hashfile.SHA1.Any())
sha1s.AddRange(hashfile.SHA1);
if (hashfile.SHA256 != null && hashfile.SHA256.Any())
sha256s.AddRange(hashfile.SHA256);
if (hashfile.SHA384 != null && hashfile.SHA384.Any())
sha384s.AddRange(hashfile.SHA384);
if (hashfile.SHA512 != null && hashfile.SHA512.Any())
sha512s.AddRange(hashfile.SHA512);
if (hashfile.SpamSum != null && hashfile.SpamSum.Any())
spamsums.AddRange(hashfile.SpamSum);
}
var hashfileItem = new Models.Hashfile.Hashfile();
if (sfvs.Any())
hashfileItem.SFV = sfvs.ToArray();
if (md5s.Any())
hashfileItem.MD5 = md5s.ToArray();
if (sha1s.Any())
hashfileItem.SHA1 = sha1s.ToArray();
if (sha256s.Any())
hashfileItem.SHA256 = sha256s.ToArray();
if (sha384s.Any())
hashfileItem.SHA384 = sha384s.ToArray();
if (sha512s.Any())
hashfileItem.SHA512 = sha512s.ToArray();
if (spamsums.Any())
hashfileItem.SpamSum = spamsums.ToArray();
return hashfileItem;
}
/// <summary>
/// Convert from <cref="Models.Internal.MetadataFile"/> to an array of <cref="Models.Hashfile.Hashfile"/>
/// </summary>
public static Models.Hashfile.Hashfile[]? ConvertArrayFromInternalModel(Models.Internal.MetadataFile? item, Hash hash)
{ {
if (item == null) if (item == null)
return null; return null;
var machines = item.Read<Models.Internal.Machine[]>(Models.Internal.MetadataFile.MachineKey); var machines = item.Read<Models.Internal.Machine[]>(Models.Internal.MetadataFile.MachineKey);
if (machines != null && machines.Any()) if (machines != null && machines.Any())
return machines.Select(machine => ConvertMachineFromInternalModel(machine, hash)).ToArray(); {
return machines
.Where(m => m != null)
.Select(machine => ConvertMachineFromInternalModel(machine, hash))
.ToArray();
}
return null; return null;
} }
@@ -162,32 +230,64 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Machine"/> to <cref="Models.Hashfile.Hashfile"/> /// Convert from <cref="Models.Internal.Machine"/> to <cref="Models.Hashfile.Hashfile"/>
/// </summary> /// </summary>
private static Models.Hashfile.Hashfile? ConvertMachineFromInternalModel(Models.Internal.Machine? item, Hash hash) private static Models.Hashfile.Hashfile ConvertMachineFromInternalModel(Models.Internal.Machine item, Hash hash)
{ {
if (item == null)
return null;
var roms = item.Read<Models.Internal.Rom[]>(Models.Internal.Machine.RomKey); var roms = item.Read<Models.Internal.Rom[]>(Models.Internal.Machine.RomKey);
if (roms == null)
return new Models.Hashfile.Hashfile();
return new Models.Hashfile.Hashfile return new Models.Hashfile.Hashfile
{ {
SFV = hash == Hash.CRC ? roms?.Select(ConvertToSFV)?.ToArray() : null, SFV = hash == Hash.CRC
MD5 = hash == Hash.MD5 ? roms?.Select(ConvertToMD5)?.ToArray() : null, ? roms
SHA1 = hash == Hash.SHA1 ? roms?.Select(ConvertToSHA1)?.ToArray() : null, .Where(r => r != null)
SHA256 = hash == Hash.SHA256 ? roms?.Select(ConvertToSHA256)?.ToArray() : null, .Select(ConvertToSFV)
SHA384 = hash == Hash.SHA384 ? roms?.Select(ConvertToSHA384)?.ToArray() : null, .ToArray()
SHA512 = hash == Hash.SHA512 ? roms?.Select(ConvertToSHA512)?.ToArray() : null, : null,
SpamSum = hash == Hash.SpamSum ? roms?.Select(ConvertToSpamSum)?.ToArray() : null, MD5 = hash == Hash.MD5
? roms
.Where(r => r != null)
.Select(ConvertToMD5)
.ToArray()
: null,
SHA1 = hash == Hash.SHA1
? roms
.Where(r => r != null)
.Select(ConvertToSHA1)
.ToArray()
: null,
SHA256 = hash == Hash.SHA256
? roms
.Where(r => r != null)
.Select(ConvertToSHA256)
.ToArray()
: null,
SHA384 = hash == Hash.SHA384
? roms
.Where(r => r != null)
.Select(ConvertToSHA384)
.ToArray()
: null,
SHA512 = hash == Hash.SHA512
? roms
.Where(r => r != null)
.Select(ConvertToSHA512)
.ToArray()
: null,
SpamSum = hash == Hash.SpamSum
? roms
.Where(r => r != null)
.Select(ConvertToSpamSum)
.ToArray()
: null,
}; };
} }
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Rom"/> to <cref="Models.Hashfile.MD5"/> /// Convert from <cref="Models.Internal.Rom"/> to <cref="Models.Hashfile.MD5"/>
/// </summary> /// </summary>
private static MD5? ConvertToMD5(Models.Internal.Rom? item) private static MD5 ConvertToMD5(Models.Internal.Rom item)
{ {
if (item == null)
return null;
var md5 = new MD5 var md5 = new MD5
{ {
Hash = item.ReadString(Models.Internal.Rom.MD5Key), Hash = item.ReadString(Models.Internal.Rom.MD5Key),
@@ -199,11 +299,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Rom"/> to <cref="Models.Hashfile.SFV"/> /// Convert from <cref="Models.Internal.Rom"/> to <cref="Models.Hashfile.SFV"/>
/// </summary> /// </summary>
private static SFV? ConvertToSFV(Models.Internal.Rom? item) private static SFV ConvertToSFV(Models.Internal.Rom item)
{ {
if (item == null)
return null;
var sfv = new SFV var sfv = new SFV
{ {
File = item.ReadString(Models.Internal.Rom.NameKey), File = item.ReadString(Models.Internal.Rom.NameKey),
@@ -215,11 +312,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Rom"/> to <cref="Models.Hashfile.SHA1"/> /// Convert from <cref="Models.Internal.Rom"/> to <cref="Models.Hashfile.SHA1"/>
/// </summary> /// </summary>
private static SHA1? ConvertToSHA1(Models.Internal.Rom? item) private static SHA1 ConvertToSHA1(Models.Internal.Rom item)
{ {
if (item == null)
return null;
var sha1 = new SHA1 var sha1 = new SHA1
{ {
Hash = item.ReadString(Models.Internal.Rom.SHA1Key), Hash = item.ReadString(Models.Internal.Rom.SHA1Key),
@@ -231,11 +325,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Rom"/> to <cref="Models.Hashfile.SHA256"/> /// Convert from <cref="Models.Internal.Rom"/> to <cref="Models.Hashfile.SHA256"/>
/// </summary> /// </summary>
private static SHA256? ConvertToSHA256(Models.Internal.Rom? item) private static SHA256 ConvertToSHA256(Models.Internal.Rom item)
{ {
if (item == null)
return null;
var sha256 = new SHA256 var sha256 = new SHA256
{ {
Hash = item.ReadString(Models.Internal.Rom.SHA256Key), Hash = item.ReadString(Models.Internal.Rom.SHA256Key),
@@ -247,11 +338,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Rom"/> to <cref="Models.Hashfile.SHA384"/> /// Convert from <cref="Models.Internal.Rom"/> to <cref="Models.Hashfile.SHA384"/>
/// </summary> /// </summary>
private static SHA384? ConvertToSHA384(Models.Internal.Rom? item) private static SHA384 ConvertToSHA384(Models.Internal.Rom item)
{ {
if (item == null)
return null;
var sha384 = new SHA384 var sha384 = new SHA384
{ {
Hash = item.ReadString(Models.Internal.Rom.SHA384Key), Hash = item.ReadString(Models.Internal.Rom.SHA384Key),
@@ -263,11 +351,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Rom"/> to <cref="Models.Hashfile.SHA512"/> /// Convert from <cref="Models.Internal.Rom"/> to <cref="Models.Hashfile.SHA512"/>
/// </summary> /// </summary>
private static SHA512? ConvertToSHA512(Models.Internal.Rom? item) private static SHA512 ConvertToSHA512(Models.Internal.Rom item)
{ {
if (item == null)
return null;
var sha512 = new SHA512 var sha512 = new SHA512
{ {
Hash = item.ReadString(Models.Internal.Rom.SHA512Key), Hash = item.ReadString(Models.Internal.Rom.SHA512Key),
@@ -279,11 +364,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Rom"/> to <cref="Models.Hashfile.SpamSum"/> /// Convert from <cref="Models.Internal.Rom"/> to <cref="Models.Hashfile.SpamSum"/>
/// </summary> /// </summary>
private static SpamSum? ConvertToSpamSum(Models.Internal.Rom? item) private static SpamSum ConvertToSpamSum(Models.Internal.Rom item)
{ {
if (item == null)
return null;
var spamsum = new SpamSum var spamsum = new SpamSum
{ {
Hash = item.ReadString(Models.Internal.Rom.SpamSumKey), Hash = item.ReadString(Models.Internal.Rom.SpamSumKey),

View File

@@ -223,8 +223,11 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Hashfile.Hashfile"/> to <cref="Models.Internal.MetadataFile"/> /// Convert from <cref="Models.Hashfile.Hashfile"/> to <cref="Models.Internal.MetadataFile"/>
/// </summary> /// </summary>
public static Models.Internal.MetadataFile ConvertToInternalModel(Models.Hashfile.Hashfile item) public static Models.Internal.MetadataFile? ConvertToInternalModel(Models.Hashfile.Hashfile? item)
{ {
if (item == null)
return null;
var metadataFile = new Models.Internal.MetadataFile var metadataFile = new Models.Internal.MetadataFile
{ {
[Models.Internal.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item), [Models.Internal.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item),

View File

@@ -1,3 +1,4 @@
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using SabreTools.Models.Internal; using SabreTools.Models.Internal;
@@ -6,6 +7,31 @@ namespace SabreTools.Serialization
{ {
public class Internal public class Internal
{ {
/// <summary>
/// Extract nested items from a Dump
/// </summary>
public static DatItem[]? ExtractItems(Dump? item)
{
if (item == null)
return null;
var datItems = new List<DatItem>();
var rom = item.Read<Rom>(Dump.RomKey);
if (rom != null)
datItems.Add(rom);
var megaRom = item.Read<Rom>(Dump.MegaRomKey);
if (megaRom != null)
datItems.Add(megaRom);
var sccPlusCart = item.Read<Rom>(Dump.SCCPlusCartKey);
if (sccPlusCart != null)
datItems.Add(sccPlusCart);
return datItems.ToArray();
}
/// <summary> /// <summary>
/// Extract nested items from a Part /// Extract nested items from a Part
/// </summary> /// </summary>
@@ -22,15 +48,26 @@ namespace SabreTools.Serialization
var dataAreas = item.Read<DataArea[]>(Part.DataAreaKey); var dataAreas = item.Read<DataArea[]>(Part.DataAreaKey);
if (dataAreas != null && dataAreas.Any()) if (dataAreas != null && dataAreas.Any())
datItems.AddRange(dataAreas.SelectMany(ExtractItems)); {
datItems.AddRange(dataAreas
.Where(d => d != null)
.SelectMany(ExtractItems));
}
var diskAreas = item.Read<DiskArea[]>(Part.DiskAreaKey); var diskAreas = item.Read<DiskArea[]>(Part.DiskAreaKey);
if (diskAreas != null && diskAreas.Any()) if (diskAreas != null && diskAreas.Any())
datItems.AddRange(diskAreas.SelectMany(ExtractItems)); {
datItems.AddRange(diskAreas
.Where(d => d != null)
.SelectMany(ExtractItems));
}
var dipSwitches = item.Read<DipSwitch[]>(Part.DipSwitchKey); var dipSwitches = item.Read<DipSwitch[]>(Part.DipSwitchKey);
if (dipSwitches != null && dipSwitches.Any()) if (dipSwitches != null && dipSwitches.Any())
datItems.AddRange(dipSwitches); {
datItems.AddRange(dipSwitches
.Where(d => d != null));
}
return datItems.ToArray(); return datItems.ToArray();
} }
@@ -38,23 +75,25 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Extract nested items from a DataArea /// Extract nested items from a DataArea
/// </summary> /// </summary>
private static Rom[]? ExtractItems(DataArea? item) private static Rom[] ExtractItems(DataArea item)
{ {
if (item == null) var roms = item.Read<Rom[]>(DataArea.RomKey);
return null; if (roms == null || !roms.Any())
return Array.Empty<Rom>();
return item.Read<Rom[]>(DataArea.RomKey); return roms.ToArray();
} }
/// <summary> /// <summary>
/// Extract nested items from a DiskArea /// Extract nested items from a DiskArea
/// </summary> /// </summary>
private static Disk[]? ExtractItems(DiskArea? item) private static Disk[] ExtractItems(DiskArea item)
{ {
if (item == null) var roms = item.Read<Disk[]>(DiskArea.DiskKey);
return null; if (roms == null || !roms.Any())
return Array.Empty<Disk>();
return item.Read<Disk[]>(DiskArea.DiskKey); return roms.ToArray();
} }
} }
} }

View File

@@ -202,7 +202,12 @@ namespace SabreTools.Serialization
var machines = item.Read<Models.Internal.Machine[]>(Models.Internal.MetadataFile.MachineKey); var machines = item.Read<Models.Internal.Machine[]>(Models.Internal.MetadataFile.MachineKey);
if (machines != null && machines.Any()) if (machines != null && machines.Any())
metadataFile.Set = machines.Select(ConvertMachineFromInternalModel).ToArray(); {
metadataFile.Set = machines
.Where(m => m != null)
.Select(ConvertMachineFromInternalModel)
.ToArray();
}
return metadataFile; return metadataFile;
} }
@@ -210,11 +215,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Machine"/> to <cref="Models.Listrom.Set"/> /// Convert from <cref="Models.Internal.Machine"/> to <cref="Models.Listrom.Set"/>
/// </summary> /// </summary>
private static Set? ConvertMachineFromInternalModel(Models.Internal.Machine? item) private static Set ConvertMachineFromInternalModel(Models.Internal.Machine item)
{ {
if (item == null)
return null;
var set = new Set(); var set = new Set();
if (item.ReadString(Models.Internal.Machine.IsDeviceKey) == "yes") if (item.ReadString(Models.Internal.Machine.IsDeviceKey) == "yes")
set.Device = item.ReadString(Models.Internal.Machine.NameKey); set.Device = item.ReadString(Models.Internal.Machine.NameKey);
@@ -225,11 +227,13 @@ namespace SabreTools.Serialization
var roms = item.Read<Models.Internal.Rom[]>(Models.Internal.Machine.RomKey); var roms = item.Read<Models.Internal.Rom[]>(Models.Internal.Machine.RomKey);
if (roms != null) if (roms != null)
rowItems.AddRange(roms.Select(ConvertFromInternalModel)); {
rowItems.AddRange(roms.Where(r => r != null).Select(ConvertFromInternalModel));
}
var disks = item.Read<Models.Internal.Disk[]>(Models.Internal.Machine.DiskKey); var disks = item.Read<Models.Internal.Disk[]>(Models.Internal.Machine.DiskKey);
if (disks != null) if (disks != null)
rowItems.AddRange(disks.Select(ConvertFromInternalModel)); rowItems.AddRange(disks.Where(d => d != null).Select(ConvertFromInternalModel));
set.Row = rowItems.ToArray(); set.Row = rowItems.ToArray();
return set; return set;
@@ -238,11 +242,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Disk"/> to <cref="Models.Listrom.Row"/> /// Convert from <cref="Models.Internal.Disk"/> to <cref="Models.Listrom.Row"/>
/// </summary> /// </summary>
private static Row? ConvertFromInternalModel(Models.Internal.Disk? item) private static Row ConvertFromInternalModel(Models.Internal.Disk item)
{ {
if (item == null)
return null;
var row = new Row var row = new Row
{ {
Name = item.ReadString(Models.Internal.Disk.NameKey), Name = item.ReadString(Models.Internal.Disk.NameKey),
@@ -261,11 +262,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Rom"/> to <cref="Models.Listrom.Row"/> /// Convert from <cref="Models.Internal.Rom"/> to <cref="Models.Listrom.Row"/>
/// </summary> /// </summary>
private static Row? ConvertFromInternalModel(Models.Internal.Rom? item) private static Row ConvertFromInternalModel(Models.Internal.Rom item)
{ {
if (item == null)
return null;
var row = new Row var row = new Row
{ {
Name = item.ReadString(Models.Internal.Rom.NameKey), Name = item.ReadString(Models.Internal.Rom.NameKey),

View File

@@ -182,15 +182,23 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Listrom.MetadataFile"/> to <cref="Models.Internal.MetadataFile"/> /// Convert from <cref="Models.Listrom.MetadataFile"/> to <cref="Models.Internal.MetadataFile"/>
/// </summary> /// </summary>
public static Models.Internal.MetadataFile ConvertToInternalModel(MetadataFile item) public static Models.Internal.MetadataFile? ConvertToInternalModel(MetadataFile? item)
{ {
if (item == null)
return null;
var metadataFile = new Models.Internal.MetadataFile var metadataFile = new Models.Internal.MetadataFile
{ {
[Models.Internal.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item), [Models.Internal.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item),
}; };
if (item?.Set != null && item.Set.Any()) if (item?.Set != null && item.Set.Any())
metadataFile[Models.Internal.MetadataFile.MachineKey] = item.Set.Select(ConvertMachineToInternalModel).ToArray(); {
metadataFile[Models.Internal.MetadataFile.MachineKey] = item.Set
.Where(s => s != null)
.Select(ConvertMachineToInternalModel)
.ToArray();
}
return metadataFile; return metadataFile;
} }

View File

@@ -11,7 +11,7 @@ namespace SabreTools.Serialization
#region Internal #region Internal
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.MetadataFile"/> to <cref="Models.Listxml.M1"/> /// Convert from <cref="Models.Internal.Models.Internal.MetadataFile"/> to <cref="Models.Listxml.M1"/>
/// </summary> /// </summary>
public static M1? ConvertM1FromInternalModel(Models.Internal.MetadataFile? item) public static M1? ConvertM1FromInternalModel(Models.Internal.MetadataFile? item)
{ {
@@ -23,13 +23,18 @@ namespace SabreTools.Serialization
var machines = item.Read<Models.Internal.Machine[]>(Models.Internal.MetadataFile.MachineKey); var machines = item.Read<Models.Internal.Machine[]>(Models.Internal.MetadataFile.MachineKey);
if (machines != null && machines.Any()) if (machines != null && machines.Any())
m1.Game = machines.Select(ConvertMachineFromInternalModel).ToArray(); {
m1.Game = machines
.Where(m => m != null)
.Select(ConvertMachineFromInternalModel)
.ToArray();
}
return m1; return m1;
} }
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.MetadataFile"/> to <cref="Models.Listxml.Mame"/> /// Convert from <cref="Models.Internal.Models.Internal.MetadataFile"/> to <cref="Models.Listxml.Mame"/>
/// </summary> /// </summary>
public static Mame? ConvertMameFromInternalModel(Models.Internal.MetadataFile? item) public static Mame? ConvertMameFromInternalModel(Models.Internal.MetadataFile? item)
{ {
@@ -41,19 +46,21 @@ namespace SabreTools.Serialization
var machines = item.Read<Models.Internal.Machine[]>(Models.Internal.MetadataFile.MachineKey); var machines = item.Read<Models.Internal.Machine[]>(Models.Internal.MetadataFile.MachineKey);
if (machines != null && machines.Any()) if (machines != null && machines.Any())
mame.Game = machines.Select(ConvertMachineFromInternalModel).ToArray(); {
mame.Game = machines
.Where(m => m != null)
.Select(ConvertMachineFromInternalModel)
.ToArray();
}
return mame; return mame;
} }
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Header"/> to <cref="Models.Listxml.M1"/> /// Convert from <cref="Models.Internal.Models.Internal.Header"/> to <cref="Models.Listxml.M1"/>
/// </summary> /// </summary>
private static M1? ConvertM1FromInternalModel(Models.Internal.Header? item) private static M1 ConvertM1FromInternalModel(Models.Internal.Header item)
{ {
if (item == null)
return null;
var m1 = new M1 var m1 = new M1
{ {
Version = item.ReadString(Models.Internal.Header.VersionKey), Version = item.ReadString(Models.Internal.Header.VersionKey),
@@ -62,13 +69,10 @@ namespace SabreTools.Serialization
} }
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Header"/> to <cref="Models.Listxml.Mame"/> /// Convert from <cref="Models.Internal.Models.Internal.Header"/> to <cref="Models.Listxml.Mame"/>
/// </summary> /// </summary>
private static Mame? ConvertMameFromInternalModel(Models.Internal.Header? item) private static Mame ConvertMameFromInternalModel(Models.Internal.Header item)
{ {
if (item == null)
return null;
var mame = new Mame var mame = new Mame
{ {
Build = item.ReadString(Models.Internal.Header.BuildKey), Build = item.ReadString(Models.Internal.Header.BuildKey),
@@ -80,13 +84,10 @@ namespace SabreTools.Serialization
} }
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Machine"/> to <cref="Models.Listxml.GameBase"/> /// Convert from <cref="Models.Internal.Models.Internal.Machine"/> to <cref="Models.Listxml.GameBase"/>
/// </summary> /// </summary>
private static GameBase? ConvertMachineFromInternalModel(Models.Internal.Machine? item) private static GameBase ConvertMachineFromInternalModel(Models.Internal.Machine item)
{ {
if (item == null)
return null;
var machine = new Machine var machine = new Machine
{ {
Name = item.ReadString(Models.Internal.Machine.NameKey), Name = item.ReadString(Models.Internal.Machine.NameKey),
@@ -105,76 +106,178 @@ namespace SabreTools.Serialization
}; };
var biosSets = item.Read<Models.Internal.BiosSet[]>(Models.Internal.Machine.BiosSetKey); var biosSets = item.Read<Models.Internal.BiosSet[]>(Models.Internal.Machine.BiosSetKey);
machine.BiosSet = biosSets?.Select(ConvertFromInternalModel)?.ToArray(); if (biosSets != null && biosSets.Any())
{
machine.BiosSet = biosSets
.Where(b => b != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
var roms = item.Read<Models.Internal.Rom[]>(Models.Internal.Machine.RomKey); var roms = item.Read<Models.Internal.Rom[]>(Models.Internal.Machine.RomKey);
machine.Rom = roms?.Select(ConvertFromInternalModel)?.ToArray(); if (roms != null && roms.Any())
{
machine.Rom = roms
.Where(r => r != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
var disks = item.Read<Models.Internal.Disk[]>(Models.Internal.Machine.DiskKey); var disks = item.Read<Models.Internal.Disk[]>(Models.Internal.Machine.DiskKey);
machine.Disk = disks?.Select(ConvertFromInternalModel)?.ToArray(); if (disks != null && disks.Any())
{
machine.Disk = disks
.Where(d => d != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
var deviceRefs = item.Read<Models.Internal.DeviceRef[]>(Models.Internal.Machine.DeviceRefKey); var deviceRefs = item.Read<Models.Internal.DeviceRef[]>(Models.Internal.Machine.DeviceRefKey);
machine.DeviceRef = deviceRefs?.Select(ConvertFromInternalModel)?.ToArray(); if (deviceRefs != null && deviceRefs.Any())
{
machine.DeviceRef = deviceRefs
.Where(d => d != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
var samples = item.Read<Models.Internal.Sample[]>(Models.Internal.Machine.SampleKey); var samples = item.Read<Models.Internal.Sample[]>(Models.Internal.Machine.SampleKey);
machine.Sample = samples?.Select(ConvertFromInternalModel)?.ToArray(); if (samples != null && samples.Any())
{
machine.Sample = samples
.Where(s => s != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
var chips = item.Read<Models.Internal.Chip[]>(Models.Internal.Machine.ChipKey); var chips = item.Read<Models.Internal.Chip[]>(Models.Internal.Machine.ChipKey);
machine.Chip = chips?.Select(ConvertFromInternalModel)?.ToArray(); if (chips != null && chips.Any())
{
machine.Chip = chips
.Where(c => c != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
var displays = item.Read<Models.Internal.Display[]>(Models.Internal.Machine.DisplayKey); var displays = item.Read<Models.Internal.Display[]>(Models.Internal.Machine.DisplayKey);
machine.Display = displays?.Select(ConvertFromInternalModel)?.ToArray(); if (displays != null && displays.Any())
{
machine.Display = displays
.Where(d => d != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
var videos = item.Read<Models.Internal.Video[]>(Models.Internal.Machine.VideoKey); var videos = item.Read<Models.Internal.Video[]>(Models.Internal.Machine.VideoKey);
machine.Video = videos?.Select(ConvertFromInternalModel)?.ToArray(); if (videos != null && videos.Any())
{
machine.Video = videos
.Where(d => d != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
var sound = item.Read<Models.Internal.Sound>(Models.Internal.Machine.SoundKey); var sound = item.Read<Models.Internal.Sound>(Models.Internal.Machine.SoundKey);
machine.Sound = ConvertFromInternalModel(sound); if (sound != null)
machine.Sound = ConvertFromInternalModel(sound);
var input = item.Read<Models.Internal.Input>(Models.Internal.Machine.InputKey); var input = item.Read<Models.Internal.Input>(Models.Internal.Machine.InputKey);
machine.Input = ConvertFromInternalModel(input); if (input != null)
machine.Input = ConvertFromInternalModel(input);
var dipSwitches = item.Read<Models.Internal.DipSwitch[]>(Models.Internal.Machine.DipSwitchKey); var dipSwitches = item.Read<Models.Internal.DipSwitch[]>(Models.Internal.Machine.DipSwitchKey);
machine.DipSwitch = dipSwitches?.Select(ConvertFromInternalModel)?.ToArray(); if (dipSwitches != null && dipSwitches.Any())
{
machine.DipSwitch = dipSwitches
.Where(d => d != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
var configurations = item.Read<Models.Internal.Configuration[]>(Models.Internal.Machine.ConfigurationKey); var configurations = item.Read<Models.Internal.Configuration[]>(Models.Internal.Machine.ConfigurationKey);
machine.Configuration = configurations?.Select(ConvertFromInternalModel)?.ToArray(); if (configurations != null && configurations.Any())
{
machine.Configuration = configurations
.Where(d => d != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
var ports = item.Read<Models.Internal.Port[]>(Models.Internal.Machine.PortKey); var ports = item.Read<Models.Internal.Port[]>(Models.Internal.Machine.PortKey);
machine.Port = ports?.Select(ConvertFromInternalModel)?.ToArray(); if (ports != null && ports.Any())
{
machine.Port = ports
.Where(d => d != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
var adjusters = item.Read<Models.Internal.Adjuster[]>(Models.Internal.Machine.AdjusterKey); var adjusters = item.Read<Models.Internal.Adjuster[]>(Models.Internal.Machine.AdjusterKey);
machine.Adjuster = adjusters?.Select(ConvertFromInternalModel)?.ToArray(); if (adjusters != null && adjusters.Any())
{
machine.Adjuster = adjusters
.Where(d => d != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
var driver = item.Read<Models.Internal.Driver>(Models.Internal.Machine.DriverKey); var driver = item.Read<Models.Internal.Driver>(Models.Internal.Machine.DriverKey);
machine.Driver = ConvertFromInternalModel(driver); if (driver != null)
machine.Driver = ConvertFromInternalModel(driver);
var features = item.Read<Models.Internal.Feature[]>(Models.Internal.Machine.FeatureKey); var features = item.Read<Models.Internal.Feature[]>(Models.Internal.Machine.FeatureKey);
machine.Feature = features?.Select(ConvertFromInternalModel)?.ToArray(); if (features != null && features.Any())
{
machine.Feature = features
.Where(d => d != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
var devices = item.Read<Models.Internal.Device[]>(Models.Internal.Machine.DeviceKey); var devices = item.Read<Models.Internal.Device[]>(Models.Internal.Machine.DeviceKey);
machine.Device = devices?.Select(ConvertFromInternalModel)?.ToArray(); if (devices != null && devices.Any())
{
machine.Device = devices
.Where(d => d != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
var slots = item.Read<Models.Internal.Slot[]>(Models.Internal.Machine.SlotKey); var slots = item.Read<Models.Internal.Slot[]>(Models.Internal.Machine.SlotKey);
machine.Slot = slots?.Select(ConvertFromInternalModel)?.ToArray(); if (slots != null && slots.Any())
{
machine.Slot = slots
.Where(d => d != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
var softwareLists = item.Read<Models.Internal.SoftwareList[]>(Models.Internal.Machine.SoftwareListKey); var softwareLists = item.Read<Models.Internal.SoftwareList[]>(Models.Internal.Machine.SoftwareListKey);
machine.SoftwareList = softwareLists?.Select(ConvertFromInternalModel)?.ToArray(); if (softwareLists != null && softwareLists.Any())
{
machine.SoftwareList = softwareLists
.Where(d => d != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
var ramOptions = item.Read<Models.Internal.RamOption[]>(Models.Internal.Machine.RamOptionKey); var ramOptions = item.Read<Models.Internal.RamOption[]>(Models.Internal.Machine.RamOptionKey);
machine.RamOption = ramOptions?.Select(ConvertFromInternalModel)?.ToArray(); if (ramOptions != null && ramOptions.Any())
{
machine.RamOption = ramOptions
.Where(d => d != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
return machine; return machine;
} }
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Adjuster"/> to <cref="Models.Listxml.Adjuster"/> /// Convert from <cref="Models.Internal.Models.Internal.Adjuster"/> to <cref="Models.Listxml.Adjuster"/>
/// </summary> /// </summary>
private static Adjuster? ConvertFromInternalModel(Models.Internal.Adjuster? item) private static Adjuster ConvertFromInternalModel(Models.Internal.Adjuster item)
{ {
if (item == null)
return null;
var adjuster = new Adjuster var adjuster = new Adjuster
{ {
Name = item.ReadString(Models.Internal.Adjuster.NameKey), Name = item.ReadString(Models.Internal.Adjuster.NameKey),
@@ -182,19 +285,17 @@ namespace SabreTools.Serialization
}; };
var condition = item.Read<Models.Internal.Condition>(Models.Internal.Adjuster.ConditionKey); var condition = item.Read<Models.Internal.Condition>(Models.Internal.Adjuster.ConditionKey);
adjuster.Condition = ConvertFromInternalModel(condition); if (condition != null)
adjuster.Condition = ConvertFromInternalModel(condition);
return adjuster; return adjuster;
} }
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Analog"/> to <cref="Models.Listxml.Analog"/> /// Convert from <cref="Models.Internal.Models.Internal.Analog"/> to <cref="Models.Listxml.Analog"/>
/// </summary> /// </summary>
private static Analog? ConvertFromInternalModel(Models.Internal.Analog? item) private static Analog ConvertFromInternalModel(Models.Internal.Analog item)
{ {
if (item == null)
return null;
var analog = new Analog var analog = new Analog
{ {
Mask = item.ReadString(Models.Internal.Analog.MaskKey), Mask = item.ReadString(Models.Internal.Analog.MaskKey),
@@ -203,13 +304,10 @@ namespace SabreTools.Serialization
} }
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.BiosSet"/> to <cref="Models.Listxml.BiosSet"/> /// Convert from <cref="Models.Internal.Models.Internal.BiosSet"/> to <cref="Models.Listxml.BiosSet"/>
/// </summary> /// </summary>
private static BiosSet? ConvertFromInternalModel(Models.Internal.BiosSet? item) private static BiosSet ConvertFromInternalModel(Models.Internal.BiosSet item)
{ {
if (item == null)
return null;
var biosset = new BiosSet var biosset = new BiosSet
{ {
Name = item.ReadString(Models.Internal.BiosSet.NameKey), Name = item.ReadString(Models.Internal.BiosSet.NameKey),
@@ -220,13 +318,10 @@ namespace SabreTools.Serialization
} }
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Chip"/> to <cref="Models.Listxml.Chip"/> /// Convert from <cref="Models.Internal.Models.Internal.Chip"/> to <cref="Models.Listxml.Chip"/>
/// </summary> /// </summary>
private static Chip? ConvertFromInternalModel(Models.Internal.Chip? item) private static Chip ConvertFromInternalModel(Models.Internal.Chip item)
{ {
if (item == null)
return null;
var chip = new Chip var chip = new Chip
{ {
Name = item.ReadString(Models.Internal.Chip.NameKey), Name = item.ReadString(Models.Internal.Chip.NameKey),
@@ -239,13 +334,10 @@ namespace SabreTools.Serialization
} }
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Condition"/> to <cref="Models.Listxml.Condition"/> /// Convert from <cref="Models.Internal.Models.Internal.Condition"/> to <cref="Models.Listxml.Condition"/>
/// </summary> /// </summary>
private static Condition? ConvertFromInternalModel(Models.Internal.Condition? item) private static Condition ConvertFromInternalModel(Models.Internal.Condition item)
{ {
if (item == null)
return null;
var condition = new Condition var condition = new Condition
{ {
Tag = item.ReadString(Models.Internal.Condition.TagKey), Tag = item.ReadString(Models.Internal.Condition.TagKey),
@@ -257,13 +349,10 @@ namespace SabreTools.Serialization
} }
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Configuration"/> to <cref="Models.Listxml.Configuration"/> /// Convert from <cref="Models.Internal.Models.Internal.Configuration"/> to <cref="Models.Listxml.Configuration"/>
/// </summary> /// </summary>
private static Configuration? ConvertFromInternalModel(Models.Internal.Configuration? item) private static Configuration ConvertFromInternalModel(Models.Internal.Configuration item)
{ {
if (item == null)
return null;
var configuration = new Configuration var configuration = new Configuration
{ {
Name = item.ReadString(Models.Internal.Configuration.NameKey), Name = item.ReadString(Models.Internal.Configuration.NameKey),
@@ -272,25 +361,35 @@ namespace SabreTools.Serialization
}; };
var condition = item.Read<Models.Internal.Condition>(Models.Internal.Configuration.ConditionKey); var condition = item.Read<Models.Internal.Condition>(Models.Internal.Configuration.ConditionKey);
configuration.Condition = ConvertFromInternalModel(condition); if (condition != null)
configuration.Condition = ConvertFromInternalModel(condition);
var confLocations = item.Read<Models.Internal.ConfLocation[]>(Models.Internal.Configuration.ConfLocationKey); var confLocations = item.Read<Models.Internal.ConfLocation[]>(Models.Internal.Configuration.ConfLocationKey);
configuration.ConfLocation = confLocations?.Select(ConvertFromInternalModel)?.ToArray(); if (confLocations != null && confLocations.Any())
{
configuration.ConfLocation = confLocations
.Where(c => c != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
var confSettings = item.Read<Models.Internal.ConfSetting[]>(Models.Internal.Configuration.ConfSettingKey); var confSettings = item.Read<Models.Internal.ConfSetting[]>(Models.Internal.Configuration.ConfSettingKey);
configuration.ConfSetting = confSettings?.Select(ConvertFromInternalModel)?.ToArray(); if (confSettings != null && confSettings.Any())
{
configuration.ConfSetting = confSettings
.Where(c => c != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
return configuration; return configuration;
} }
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.ConfLocation"/> to <cref="Models.Listxml.ConfLocation"/> /// Convert from <cref="Models.Internal.Models.Internal.ConfLocation"/> to <cref="Models.Listxml.ConfLocation"/>
/// </summary> /// </summary>
private static ConfLocation? ConvertFromInternalModel(Models.Internal.ConfLocation? item) private static ConfLocation ConvertFromInternalModel(Models.Internal.ConfLocation item)
{ {
if (item == null)
return null;
var confLocation = new ConfLocation var confLocation = new ConfLocation
{ {
Name = item.ReadString(Models.Internal.ConfLocation.NameKey), Name = item.ReadString(Models.Internal.ConfLocation.NameKey),
@@ -301,13 +400,10 @@ namespace SabreTools.Serialization
} }
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.ConfSetting"/> to <cref="Models.Listxml.ConfSetting"/> /// Convert from <cref="Models.Internal.Models.Internal.ConfSetting"/> to <cref="Models.Listxml.ConfSetting"/>
/// </summary> /// </summary>
private static ConfSetting? ConvertFromInternalModel(Models.Internal.ConfSetting? item) private static ConfSetting ConvertFromInternalModel(Models.Internal.ConfSetting item)
{ {
if (item == null)
return null;
var confSetting = new ConfSetting var confSetting = new ConfSetting
{ {
Name = item.ReadString(Models.Internal.ConfSetting.NameKey), Name = item.ReadString(Models.Internal.ConfSetting.NameKey),
@@ -316,19 +412,17 @@ namespace SabreTools.Serialization
}; };
var condition = item.Read<Models.Internal.Condition>(Models.Internal.ConfSetting.ConditionKey); var condition = item.Read<Models.Internal.Condition>(Models.Internal.ConfSetting.ConditionKey);
confSetting.Condition = ConvertFromInternalModel(condition); if (condition != null)
confSetting.Condition = ConvertFromInternalModel(condition);
return confSetting; return confSetting;
} }
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Control"/> to <cref="Models.Listxml.Control"/> /// Convert from <cref="Models.Internal.Models.Internal.Control"/> to <cref="Models.Listxml.Control"/>
/// </summary> /// </summary>
private static Control? ConvertFromInternalModel(Models.Internal.Control? item) private static Control ConvertFromInternalModel(Models.Internal.Control item)
{ {
if (item == null)
return null;
var control = new Control var control = new Control
{ {
Type = item.ReadString(Models.Internal.Control.TypeKey), Type = item.ReadString(Models.Internal.Control.TypeKey),
@@ -348,13 +442,10 @@ namespace SabreTools.Serialization
} }
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Device"/> to <cref="Models.Listxml.Device"/> /// Convert from <cref="Models.Internal.Models.Internal.Device"/> to <cref="Models.Listxml.Device"/>
/// </summary> /// </summary>
private static Device? ConvertFromInternalModel(Models.Internal.Device? item) private static Device ConvertFromInternalModel(Models.Internal.Device item)
{ {
if (item == null)
return null;
var device = new Device var device = new Device
{ {
Type = item.ReadString(Models.Internal.Device.TypeKey), Type = item.ReadString(Models.Internal.Device.TypeKey),
@@ -365,22 +456,26 @@ namespace SabreTools.Serialization
}; };
var instance = item.Read<Models.Internal.Instance>(Models.Internal.Device.InstanceKey); var instance = item.Read<Models.Internal.Instance>(Models.Internal.Device.InstanceKey);
device.Instance = ConvertFromInternalModel(instance); if (instance != null)
device.Instance = ConvertFromInternalModel(instance);
var extensions = item.Read<Models.Internal.Extension[]>(Models.Internal.Device.ExtensionKey); var extensions = item.Read<Models.Internal.Extension[]>(Models.Internal.Device.ExtensionKey);
device.Extension = extensions?.Select(ConvertFromInternalModel)?.ToArray(); if (extensions != null && extensions.Any())
{
device.Extension = extensions
.Where(e => e != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
return device; return device;
} }
/// <summary> /// <summary>
/// Convert from <cref="DeviceRef"/> to <cref="Models.Listxml.DeviceRef"/> /// Convert from <cref="Models.Internal.DeviceRef"/> to <cref="Models.Listxml.DeviceRef"/>
/// </summary> /// </summary>
private static DeviceRef? ConvertFromInternalModel(Models.Internal.DeviceRef? item) private static DeviceRef ConvertFromInternalModel(Models.Internal.DeviceRef item)
{ {
if (item == null)
return null;
var deviceRef = new DeviceRef var deviceRef = new DeviceRef
{ {
Name = item.ReadString(Models.Internal.DeviceRef.NameKey), Name = item.ReadString(Models.Internal.DeviceRef.NameKey),
@@ -389,13 +484,10 @@ namespace SabreTools.Serialization
} }
/// <summary> /// <summary>
/// Convert from <cref="DipLocation"/> to <cref="Models.Listxml.DipLocation"/> /// Convert from <cref="Models.Internal.DipLocation"/> to <cref="Models.Listxml.DipLocation"/>
/// </summary> /// </summary>
private static DipLocation? ConvertFromInternalModel(Models.Internal.DipLocation? item) private static DipLocation ConvertFromInternalModel(Models.Internal.DipLocation item)
{ {
if (item == null)
return null;
var dipLocation = new DipLocation var dipLocation = new DipLocation
{ {
Name = item.ReadString(Models.Internal.DipLocation.NameKey), Name = item.ReadString(Models.Internal.DipLocation.NameKey),
@@ -406,13 +498,10 @@ namespace SabreTools.Serialization
} }
/// <summary> /// <summary>
/// Convert from <cref="DipSwitch"/> to <cref="Models.Listxml.DipSwitch"/> /// Convert from <cref="Models.Internal.DipSwitch"/> to <cref="Models.Listxml.DipSwitch"/>
/// </summary> /// </summary>
private static DipSwitch? ConvertFromInternalModel(Models.Internal.DipSwitch? item) private static DipSwitch ConvertFromInternalModel(Models.Internal.DipSwitch item)
{ {
if (item == null)
return null;
var dipSwitch = new DipSwitch var dipSwitch = new DipSwitch
{ {
Name = item.ReadString(Models.Internal.DipSwitch.NameKey), Name = item.ReadString(Models.Internal.DipSwitch.NameKey),
@@ -421,25 +510,35 @@ namespace SabreTools.Serialization
}; };
var condition = item.Read<Models.Internal.Condition>(Models.Internal.DipSwitch.ConditionKey); var condition = item.Read<Models.Internal.Condition>(Models.Internal.DipSwitch.ConditionKey);
dipSwitch.Condition = ConvertFromInternalModel(condition); if (condition != null)
dipSwitch.Condition = ConvertFromInternalModel(condition);
var dipLocations = item.Read<Models.Internal.DipLocation[]>(Models.Internal.DipSwitch.DipLocationKey); var dipLocations = item.Read<Models.Internal.DipLocation[]>(Models.Internal.DipSwitch.DipLocationKey);
dipSwitch.DipLocation = dipLocations?.Select(ConvertFromInternalModel)?.ToArray(); if (dipLocations != null && dipLocations.Any())
{
dipSwitch.DipLocation = dipLocations
.Where(d => d != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
var dipValues = item.Read<Models.Internal.DipValue[]>(Models.Internal.DipSwitch.DipValueKey); var dipValues = item.Read<Models.Internal.DipValue[]>(Models.Internal.DipSwitch.DipValueKey);
dipSwitch.DipValue = dipValues?.Select(ConvertFromInternalModel)?.ToArray(); if (dipValues != null && dipValues.Any())
{
dipSwitch.DipValue = dipValues
.Where(d => d != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
return dipSwitch; return dipSwitch;
} }
/// <summary> /// <summary>
/// Convert from <cref="DipValue"/> to <cref="Models.Listxml.DipValue"/> /// Convert from <cref="Models.Internal.DipValue"/> to <cref="Models.Listxml.DipValue"/>
/// </summary> /// </summary>
private static DipValue? ConvertFromInternalModel(Models.Internal.DipValue? item) private static DipValue ConvertFromInternalModel(Models.Internal.DipValue item)
{ {
if (item == null)
return null;
var dipValue = new DipValue var dipValue = new DipValue
{ {
Name = item.ReadString(Models.Internal.DipValue.NameKey), Name = item.ReadString(Models.Internal.DipValue.NameKey),
@@ -448,19 +547,17 @@ namespace SabreTools.Serialization
}; };
var condition = item.Read<Models.Internal.Condition>(Models.Internal.DipValue.ConditionKey); var condition = item.Read<Models.Internal.Condition>(Models.Internal.DipValue.ConditionKey);
dipValue.Condition = ConvertFromInternalModel(condition); if (condition != null)
dipValue.Condition = ConvertFromInternalModel(condition);
return dipValue; return dipValue;
} }
/// <summary> /// <summary>
/// Convert from <cref="Disk"/> to <cref="Models.Listxml.Disk"/> /// Convert from <cref="Models.Internal.Disk"/> to <cref="Models.Listxml.Disk"/>
/// </summary> /// </summary>
private static Disk? ConvertFromInternalModel(Models.Internal.Disk? item) private static Disk ConvertFromInternalModel(Models.Internal.Disk item)
{ {
if (item == null)
return null;
var disk = new Disk var disk = new Disk
{ {
Name = item.ReadString(Models.Internal.Disk.NameKey), Name = item.ReadString(Models.Internal.Disk.NameKey),
@@ -477,13 +574,10 @@ namespace SabreTools.Serialization
} }
/// <summary> /// <summary>
/// Convert from <cref="Display"/> to <cref="Models.Listxml.Display"/> /// Convert from <cref="Models.Internal.Display"/> to <cref="Models.Listxml.Display"/>
/// </summary> /// </summary>
private static Display? ConvertFromInternalModel(Models.Internal.Display? item) private static Display ConvertFromInternalModel(Models.Internal.Display item)
{ {
if (item == null)
return null;
var display = new Display var display = new Display
{ {
Tag = item.ReadString(Models.Internal.Display.TagKey), Tag = item.ReadString(Models.Internal.Display.TagKey),
@@ -505,13 +599,10 @@ namespace SabreTools.Serialization
} }
/// <summary> /// <summary>
/// Convert from <cref="Driver"/> to <cref="Models.Listxml.Driver"/> /// Convert from <cref="Models.Internal.Driver"/> to <cref="Models.Listxml.Driver"/>
/// </summary> /// </summary>
private static Driver? ConvertFromInternalModel(Models.Internal.Driver? item) private static Driver ConvertFromInternalModel(Models.Internal.Driver item)
{ {
if (item == null)
return null;
var driver = new Driver var driver = new Driver
{ {
Status = item.ReadString(Models.Internal.Driver.StatusKey), Status = item.ReadString(Models.Internal.Driver.StatusKey),
@@ -530,13 +621,10 @@ namespace SabreTools.Serialization
} }
/// <summary> /// <summary>
/// Convert from <cref="Extension"/> to <cref="Models.Listxml.Extension"/> /// Convert from <cref="Models.Internal.Extension"/> to <cref="Models.Listxml.Extension"/>
/// </summary> /// </summary>
private static Extension? ConvertFromInternalModel(Models.Internal.Extension? item) private static Extension ConvertFromInternalModel(Models.Internal.Extension item)
{ {
if (item == null)
return null;
var extension = new Extension var extension = new Extension
{ {
Name = item.ReadString(Models.Internal.Extension.NameKey), Name = item.ReadString(Models.Internal.Extension.NameKey),
@@ -545,13 +633,10 @@ namespace SabreTools.Serialization
} }
/// <summary> /// <summary>
/// Convert from <cref="Feature"/> to <cref="Models.Listxml.Feature"/> /// Convert from <cref="Models.Internal.Feature"/> to <cref="Models.Listxml.Feature"/>
/// </summary> /// </summary>
private static Feature? ConvertFromInternalModel(Models.Internal.Feature? item) private static Feature ConvertFromInternalModel(Models.Internal.Feature item)
{ {
if (item == null)
return null;
var feature = new Feature var feature = new Feature
{ {
Type = item.ReadString(Models.Internal.Feature.TypeKey), Type = item.ReadString(Models.Internal.Feature.TypeKey),
@@ -562,13 +647,10 @@ namespace SabreTools.Serialization
} }
/// <summary> /// <summary>
/// Convert from <cref="Input"/> to <cref="Models.Listxml.Input"/> /// Convert from <cref="Models.Internal.Input"/> to <cref="Models.Listxml.Input"/>
/// </summary> /// </summary>
private static Input? ConvertFromInternalModel(Models.Internal.Input? item) private static Input ConvertFromInternalModel(Models.Internal.Input item)
{ {
if (item == null)
return null;
var input = new Input var input = new Input
{ {
Service = item.ReadString(Models.Internal.Input.ServiceKey), Service = item.ReadString(Models.Internal.Input.ServiceKey),
@@ -580,19 +662,22 @@ namespace SabreTools.Serialization
}; };
var controls = item.Read<Models.Internal.Control[]>(Models.Internal.Input.ControlKey); var controls = item.Read<Models.Internal.Control[]>(Models.Internal.Input.ControlKey);
input.Control = controls?.Select(ConvertFromInternalModel)?.ToArray(); if (controls != null && controls.Any())
{
input.Control = controls
.Where(c => c != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
return input; return input;
} }
/// <summary> /// <summary>
/// Convert from <cref="Instance"/> to <cref="Models.Listxml.Instance"/> /// Convert from <cref="Models.Internal.Instance"/> to <cref="Models.Listxml.Instance"/>
/// </summary> /// </summary>
private static Instance? ConvertFromInternalModel(Models.Internal.Instance? item) private static Instance ConvertFromInternalModel(Models.Internal.Instance item)
{ {
if (item == null)
return null;
var instance = new Instance var instance = new Instance
{ {
Name = item.ReadString(Models.Internal.Instance.NameKey), Name = item.ReadString(Models.Internal.Instance.NameKey),
@@ -602,32 +687,32 @@ namespace SabreTools.Serialization
} }
/// <summary> /// <summary>
/// Convert from <cref="Port"/> to <cref="Models.Listxml.Port"/> /// Convert from <cref="Models.Internal.Port"/> to <cref="Models.Listxml.Port"/>
/// </summary> /// </summary>
private static Port? ConvertFromInternalModel(Models.Internal.Port? item) private static Port ConvertFromInternalModel(Models.Internal.Port item)
{ {
if (item == null)
return null;
var port = new Port var port = new Port
{ {
Tag = item.ReadString(Models.Internal.Port.TagKey), Tag = item.ReadString(Models.Internal.Port.TagKey),
}; };
var analogs = item.Read<Models.Internal.Analog[]>(Models.Internal.Port.AnalogKey); var analogs = item.Read<Models.Internal.Analog[]>(Models.Internal.Port.AnalogKey);
port.Analog = analogs?.Select(ConvertFromInternalModel)?.ToArray(); if (analogs != null && analogs.Any())
{
port.Analog = analogs
.Where(a => a != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
return port; return port;
} }
/// <summary> /// <summary>
/// Convert from <cref="RamOption"/> to <cref="Models.Listxml.RamOption"/> /// Convert from <cref="Models.Internal.RamOption"/> to <cref="Models.Listxml.RamOption"/>
/// </summary> /// </summary>
private static RamOption? ConvertFromInternalModel(Models.Internal.RamOption? item) private static RamOption ConvertFromInternalModel(Models.Internal.RamOption item)
{ {
if (item == null)
return null;
var ramOption = new RamOption var ramOption = new RamOption
{ {
Name = item.ReadString(Models.Internal.RamOption.NameKey), Name = item.ReadString(Models.Internal.RamOption.NameKey),
@@ -637,13 +722,10 @@ namespace SabreTools.Serialization
} }
/// <summary> /// <summary>
/// Convert from <cref="Rom"/> to <cref="Models.Listxml.Rom"/> /// Convert from <cref="Models.Internal.Rom"/> to <cref="Models.Listxml.Rom"/>
/// </summary> /// </summary>
private static Rom? ConvertFromInternalModel(Models.Internal.Rom? item) private static Rom ConvertFromInternalModel(Models.Internal.Rom item)
{ {
if (item == null)
return null;
var rom = new Rom var rom = new Rom
{ {
Name = item.ReadString(Models.Internal.Rom.NameKey), Name = item.ReadString(Models.Internal.Rom.NameKey),
@@ -663,13 +745,10 @@ namespace SabreTools.Serialization
} }
/// <summary> /// <summary>
/// Convert from <cref="Sample"/> to <cref="Models.Listxml.Sample"/> /// Convert from <cref="Models.Internal.Sample"/> to <cref="Models.Listxml.Sample"/>
/// </summary> /// </summary>
private static Sample? ConvertFromInternalModel(Models.Internal.Sample? item) private static Sample ConvertFromInternalModel(Models.Internal.Sample item)
{ {
if (item == null)
return null;
var sample = new Sample var sample = new Sample
{ {
Name = item.ReadString(Models.Internal.Sample.NameKey), Name = item.ReadString(Models.Internal.Sample.NameKey),
@@ -678,32 +757,32 @@ namespace SabreTools.Serialization
} }
/// <summary> /// <summary>
/// Convert from <cref="Slot"/> to <cref="Models.Listxml.Slot"/> /// Convert from <cref="Models.Internal.Slot"/> to <cref="Models.Listxml.Slot"/>
/// </summary> /// </summary>
private static Slot? ConvertFromInternalModel(Models.Internal.Slot? item) private static Slot ConvertFromInternalModel(Models.Internal.Slot item)
{ {
if (item == null)
return null;
var slot = new Slot var slot = new Slot
{ {
Name = item.ReadString(Models.Internal.Slot.NameKey), Name = item.ReadString(Models.Internal.Slot.NameKey),
}; };
var slotOptions = item.Read<Models.Internal.SlotOption[]>(Models.Internal.Slot.SlotOptionKey); var slotOptions = item.Read<Models.Internal.SlotOption[]>(Models.Internal.Slot.SlotOptionKey);
slot.SlotOption = slotOptions?.Select(ConvertFromInternalModel)?.ToArray(); if (slotOptions != null && slotOptions.Any())
{
slot.SlotOption = slotOptions
.Where(s => s != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
return slot; return slot;
} }
/// <summary> /// <summary>
/// Convert from <cref="SlotOption"/> to <cref="Models.Listxml.SlotOption"/> /// Convert from <cref="Models.Internal.SlotOption"/> to <cref="Models.Listxml.SlotOption"/>
/// </summary> /// </summary>
private static SlotOption? ConvertFromInternalModel(Models.Internal.SlotOption? item) private static SlotOption ConvertFromInternalModel(Models.Internal.SlotOption item)
{ {
if (item == null)
return null;
var slotOption = new SlotOption var slotOption = new SlotOption
{ {
Name = item.ReadString(Models.Internal.SlotOption.NameKey), Name = item.ReadString(Models.Internal.SlotOption.NameKey),
@@ -714,13 +793,10 @@ namespace SabreTools.Serialization
} }
/// <summary> /// <summary>
/// Convert from <cref="SoftwareList"/> to <cref="Models.Listxml.SoftwareList"/> /// Convert from <cref="Models.Internal.SoftwareList"/> to <cref="Models.Listxml.SoftwareList"/>
/// </summary> /// </summary>
private static SoftwareList? ConvertFromInternalModel(Models.Internal.SoftwareList? item) private static SoftwareList ConvertFromInternalModel(Models.Internal.SoftwareList item)
{ {
if (item == null)
return null;
var softwareList = new SoftwareList var softwareList = new SoftwareList
{ {
Tag = item.ReadString(Models.Internal.SoftwareList.TagKey), Tag = item.ReadString(Models.Internal.SoftwareList.TagKey),
@@ -732,13 +808,10 @@ namespace SabreTools.Serialization
} }
/// <summary> /// <summary>
/// Convert from <cref="Sound"/> to <cref="Models.Listxml.Sound"/> /// Convert from <cref="Models.Internal.Sound"/> to <cref="Models.Listxml.Sound"/>
/// </summary> /// </summary>
private static Sound? ConvertFromInternalModel(Models.Internal.Sound? item) private static Sound ConvertFromInternalModel(Models.Internal.Sound item)
{ {
if (item == null)
return null;
var sound = new Sound var sound = new Sound
{ {
Channels = item.ReadString(Models.Internal.Sound.ChannelsKey), Channels = item.ReadString(Models.Internal.Sound.ChannelsKey),
@@ -747,13 +820,10 @@ namespace SabreTools.Serialization
} }
/// <summary> /// <summary>
/// Convert from <cref="Video"/> to <cref="Models.Listxml.Video"/> /// Convert from <cref="Models.Internal.Video"/> to <cref="Models.Listxml.Video"/>
/// </summary> /// </summary>
private static Video? ConvertFromInternalModel(Models.Internal.Video? item) private static Video ConvertFromInternalModel(Models.Internal.Video item)
{ {
if (item == null)
return null;
var video = new Video var video = new Video
{ {
Screen = item.ReadString(Models.Internal.Video.ScreenKey), Screen = item.ReadString(Models.Internal.Video.ScreenKey),

View File

@@ -13,15 +13,23 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Listxml.M1"/> to <cref="Models.Internal.MetadataFile"/> /// Convert from <cref="Models.Listxml.M1"/> to <cref="Models.Internal.MetadataFile"/>
/// </summary> /// </summary>
public static Models.Internal.MetadataFile ConvertToInternalModel(M1 item) public static Models.Internal.MetadataFile? ConvertToInternalModel(M1? item)
{ {
if (item == null)
return null;
var metadataFile = new Models.Internal.MetadataFile var metadataFile = new Models.Internal.MetadataFile
{ {
[Models.Internal.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item), [Models.Internal.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item),
}; };
if (item?.Game != null && item.Game.Any()) if (item?.Game != null && item.Game.Any())
metadataFile[Models.Internal.MetadataFile.MachineKey] = item.Game.Select(ConvertMachineToInternalModel).ToArray(); {
metadataFile[Models.Internal.MetadataFile.MachineKey] = item.Game
.Where(g => g != null)
.Select(ConvertMachineToInternalModel)
.ToArray();
}
return metadataFile; return metadataFile;
} }
@@ -29,15 +37,23 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Listxml.Mame"/> to <cref="Models.Internal.MetadataFile"/> /// Convert from <cref="Models.Listxml.Mame"/> to <cref="Models.Internal.MetadataFile"/>
/// </summary> /// </summary>
public static Models.Internal.MetadataFile ConvertToInternalModel(Mame item) public static Models.Internal.MetadataFile? ConvertToInternalModel(Mame? item)
{ {
if (item == null)
return null;
var metadataFile = new Models.Internal.MetadataFile var metadataFile = new Models.Internal.MetadataFile
{ {
[Models.Internal.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item), [Models.Internal.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item),
}; };
if (item?.Game != null && item.Game.Any()) if (item?.Game != null && item.Game.Any())
metadataFile[Models.Internal.MetadataFile.MachineKey] = item.Game.Select(ConvertMachineToInternalModel).ToArray(); {
metadataFile[Models.Internal.MetadataFile.MachineKey] = item.Game
.Where(g => g != null)
.Select(ConvertMachineToInternalModel)
.ToArray();
}
return metadataFile; return metadataFile;
} }
@@ -91,28 +107,68 @@ namespace SabreTools.Serialization
}; };
if (item.BiosSet != null && item.BiosSet.Any()) if (item.BiosSet != null && item.BiosSet.Any())
machine[Models.Internal.Machine.BiosSetKey] = item.BiosSet.Select(ConvertToInternalModel).ToArray(); {
machine[Models.Internal.Machine.BiosSetKey] = item.BiosSet
.Where(b => b != null)
.Select(ConvertToInternalModel)
.ToArray();
}
if (item.Rom != null && item.Rom.Any()) if (item.Rom != null && item.Rom.Any())
machine[Models.Internal.Machine.RomKey] = item.Rom.Select(ConvertToInternalModel).ToArray(); {
machine[Models.Internal.Machine.RomKey] = item.Rom
.Where(r => r != null)
.Select(ConvertToInternalModel)
.ToArray();
}
if (item.Disk != null && item.Disk.Any()) if (item.Disk != null && item.Disk.Any())
machine[Models.Internal.Machine.DiskKey] = item.Disk.Select(ConvertToInternalModel).ToArray(); {
machine[Models.Internal.Machine.DiskKey] = item.Disk
.Where(d => d != null)
.Select(ConvertToInternalModel)
.ToArray();
}
if (item.DeviceRef != null && item.DeviceRef.Any()) if (item.DeviceRef != null && item.DeviceRef.Any())
machine[Models.Internal.Machine.DeviceRefKey] = item.DeviceRef.Select(ConvertToInternalModel).ToArray(); {
machine[Models.Internal.Machine.DeviceRefKey] = item.DeviceRef
.Where(d => d != null)
.Select(ConvertToInternalModel)
.ToArray();
}
if (item.Sample != null && item.Sample.Any()) if (item.Sample != null && item.Sample.Any())
machine[Models.Internal.Machine.SampleKey] = item.Sample.Select(ConvertToInternalModel).ToArray(); {
machine[Models.Internal.Machine.SampleKey] = item.Sample
.Where(s => s != null)
.Select(ConvertToInternalModel)
.ToArray();
}
if (item.Chip != null && item.Chip.Any()) if (item.Chip != null && item.Chip.Any())
machine[Models.Internal.Machine.ChipKey] = item.Chip.Select(ConvertToInternalModel).ToArray(); {
machine[Models.Internal.Machine.ChipKey] = item.Chip
.Where(c => c != null)
.Select(ConvertToInternalModel)
.ToArray();
}
if (item.Display != null && item.Display.Any()) if (item.Display != null && item.Display.Any())
machine[Models.Internal.Machine.DisplayKey] = item.Display.Select(ConvertToInternalModel).ToArray(); {
machine[Models.Internal.Machine.DisplayKey] = item.Display
.Where(d => d != null)
.Select(ConvertToInternalModel)
.ToArray();
}
if (item.Video != null && item.Video.Any()) if (item.Video != null && item.Video.Any())
machine[Models.Internal.Machine.VideoKey] = item.Video.Select(ConvertToInternalModel).ToArray(); {
machine[Models.Internal.Machine.VideoKey] = item.Video
.Where(v => v != null)
.Select(ConvertToInternalModel)
.ToArray();
}
if (item.Sound != null) if (item.Sound != null)
machine[Models.Internal.Machine.SoundKey] = ConvertToInternalModel(item.Sound); machine[Models.Internal.Machine.SoundKey] = ConvertToInternalModel(item.Sound);
@@ -121,34 +177,79 @@ namespace SabreTools.Serialization
machine[Models.Internal.Machine.InputKey] = ConvertToInternalModel(item.Input); machine[Models.Internal.Machine.InputKey] = ConvertToInternalModel(item.Input);
if (item.DipSwitch != null && item.DipSwitch.Any()) if (item.DipSwitch != null && item.DipSwitch.Any())
machine[Models.Internal.Machine.DipSwitchKey] = item.DipSwitch.Select(ConvertToInternalModel).ToArray(); {
machine[Models.Internal.Machine.DipSwitchKey] = item.DipSwitch
.Where(d => d != null)
.Select(ConvertToInternalModel)
.ToArray();
}
if (item.Configuration != null && item.Configuration.Any()) if (item.Configuration != null && item.Configuration.Any())
machine[Models.Internal.Machine.ConfigurationKey] = item.Configuration.Select(ConvertToInternalModel).ToArray(); {
machine[Models.Internal.Machine.ConfigurationKey] = item.Configuration
.Where(c => c != null)
.Select(ConvertToInternalModel)
.ToArray();
}
if (item.Port != null && item.Port.Any()) if (item.Port != null && item.Port.Any())
machine[Models.Internal.Machine.PortKey] = item.Port.Select(ConvertToInternalModel).ToArray(); {
machine[Models.Internal.Machine.PortKey] = item.Port
.Where(p => p != null)
.Select(ConvertToInternalModel)
.ToArray();
}
if (item.Adjuster != null && item.Adjuster.Any()) if (item.Adjuster != null && item.Adjuster.Any())
machine[Models.Internal.Machine.AdjusterKey] = item.Adjuster.Select(ConvertToInternalModel).ToArray(); {
machine[Models.Internal.Machine.AdjusterKey] = item.Adjuster
.Where(a => a != null)
.Select(ConvertToInternalModel)
.ToArray();
}
if (item.Driver != null) if (item.Driver != null)
machine[Models.Internal.Machine.DriverKey] = ConvertToInternalModel(item.Driver); machine[Models.Internal.Machine.DriverKey] = ConvertToInternalModel(item.Driver);
if (item.Feature != null && item.Feature.Any()) if (item.Feature != null && item.Feature.Any())
machine[Models.Internal.Machine.FeatureKey] = item.Feature.Select(ConvertToInternalModel).ToArray(); {
machine[Models.Internal.Machine.FeatureKey] = item.Feature
.Where(f => f != null)
.Select(ConvertToInternalModel)
.ToArray();
}
if (item.Device != null && item.Device.Any()) if (item.Device != null && item.Device.Any())
machine[Models.Internal.Machine.DeviceKey] = item.Device.Select(ConvertToInternalModel).ToArray(); {
machine[Models.Internal.Machine.DeviceKey] = item.Device
.Where(d => d != null)
.Select(ConvertToInternalModel)
.ToArray();
}
if (item.Slot != null && item.Slot.Any()) if (item.Slot != null && item.Slot.Any())
machine[Models.Internal.Machine.SlotKey] = item.Slot.Select(ConvertToInternalModel).ToArray(); {
machine[Models.Internal.Machine.SlotKey] = item.Slot
.Where(s => s != null)
.Select(ConvertToInternalModel)
.ToArray();
}
if (item.SoftwareList != null && item.SoftwareList.Any()) if (item.SoftwareList != null && item.SoftwareList.Any())
machine[Models.Internal.Machine.SoftwareListKey] = item.SoftwareList.Select(ConvertToInternalModel).ToArray(); {
machine[Models.Internal.Machine.SoftwareListKey] = item.SoftwareList
.Where(s => s != null)
.Select(ConvertToInternalModel)
.ToArray();
}
if (item.RamOption != null && item.RamOption.Any()) if (item.RamOption != null && item.RamOption.Any())
machine[Models.Internal.Machine.RamOptionKey] = item.RamOption.Select(ConvertToInternalModel).ToArray(); {
machine[Models.Internal.Machine.RamOptionKey] = item.RamOption
.Where(r => r != null)
.Select(ConvertToInternalModel)
.ToArray();
}
return machine; return machine;
} }
@@ -243,10 +344,20 @@ namespace SabreTools.Serialization
configuration[Models.Internal.Configuration.ConditionKey] = ConvertToInternalModel(item.Condition); configuration[Models.Internal.Configuration.ConditionKey] = ConvertToInternalModel(item.Condition);
if (item.ConfLocation != null && item.ConfLocation.Any()) if (item.ConfLocation != null && item.ConfLocation.Any())
configuration[Models.Internal.Configuration.ConfLocationKey] = item.ConfLocation.Select(ConvertToInternalModel).ToArray(); {
configuration[Models.Internal.Configuration.ConfLocationKey] = item.ConfLocation
.Where(c => c != null)
.Select(ConvertToInternalModel)
.ToArray();
}
if (item.ConfSetting != null && item.ConfSetting.Any()) if (item.ConfSetting != null && item.ConfSetting.Any())
configuration[Models.Internal.Configuration.ConfSettingKey] = item.ConfSetting.Select(ConvertToInternalModel).ToArray(); {
configuration[Models.Internal.Configuration.ConfSettingKey] = item.ConfSetting
.Where(c => c != null)
.Select(ConvertToInternalModel)
.ToArray();
}
return configuration; return configuration;
} }
@@ -324,7 +435,12 @@ namespace SabreTools.Serialization
device[Models.Internal.Device.InstanceKey] = ConvertToInternalModel(item.Instance); device[Models.Internal.Device.InstanceKey] = ConvertToInternalModel(item.Instance);
if (item.Extension != null && item.Extension.Any()) if (item.Extension != null && item.Extension.Any())
device[Models.Internal.Device.ExtensionKey] = item.Extension.Select(ConvertToInternalModel).ToArray(); {
device[Models.Internal.Device.ExtensionKey] = item.Extension
.Where(e => e != null)
.Select(ConvertToInternalModel)
.ToArray();
}
return device; return device;
} }
@@ -371,10 +487,20 @@ namespace SabreTools.Serialization
dipSwitch[Models.Internal.DipSwitch.ConditionKey] = ConvertToInternalModel(item.Condition); dipSwitch[Models.Internal.DipSwitch.ConditionKey] = ConvertToInternalModel(item.Condition);
if (item.DipLocation != null && item.DipLocation.Any()) if (item.DipLocation != null && item.DipLocation.Any())
dipSwitch[Models.Internal.DipSwitch.DipLocationKey] = item.DipLocation.Select(ConvertToInternalModel).ToArray(); {
dipSwitch[Models.Internal.DipSwitch.DipLocationKey] = item.DipLocation
.Where(d => d != null)
.Select(ConvertToInternalModel)
.ToArray();
}
if (item.DipValue != null && item.DipValue.Any()) if (item.DipValue != null && item.DipValue.Any())
dipSwitch[Models.Internal.DipSwitch.DipValueKey] = item.DipValue.Select(ConvertToInternalModel).ToArray(); {
dipSwitch[Models.Internal.DipSwitch.DipValueKey] = item.DipValue
.Where(d => d != null)
.Select(ConvertToInternalModel)
.ToArray();
}
return dipSwitch; return dipSwitch;
} }
@@ -506,7 +632,12 @@ namespace SabreTools.Serialization
}; };
if (item.Control != null && item.Control.Any()) if (item.Control != null && item.Control.Any())
input[Models.Internal.Input.ControlKey] = item.Control.Select(ConvertToInternalModel).ToArray(); {
input[Models.Internal.Input.ControlKey] = item.Control
.Where(c => c != null)
.Select(ConvertToInternalModel)
.ToArray();
}
return input; return input;
} }
@@ -535,7 +666,12 @@ namespace SabreTools.Serialization
}; };
if (item.Analog != null && item.Analog.Any()) if (item.Analog != null && item.Analog.Any())
port[Models.Internal.Port.AnalogKey] = item.Analog.Select(ConvertToInternalModel).ToArray(); {
port[Models.Internal.Port.AnalogKey] = item.Analog
.Where(a => a != null)
.Select(ConvertToInternalModel)
.ToArray();
}
return port; return port;
} }
@@ -599,7 +735,12 @@ namespace SabreTools.Serialization
}; };
if (item.SlotOption != null && item.SlotOption.Any()) if (item.SlotOption != null && item.SlotOption.Any())
slot[Models.Internal.Slot.SlotOptionKey] = item.SlotOption.Select(ConvertToInternalModel).ToArray(); {
slot[Models.Internal.Slot.SlotOptionKey] = item.SlotOption
.Where(s => s != null)
.Select(ConvertToInternalModel)
.ToArray();
}
return slot; return slot;
} }

View File

@@ -29,10 +29,15 @@ namespace SabreTools.Serialization
if (header != null) if (header != null)
datafile.Header = ConvertHeaderFromInternalModel(header); datafile.Header = ConvertHeaderFromInternalModel(header);
// TODO: Handle Dir items // TODO: Handle Dir items - Currently need to be generated from the machines
var machines = item.Read<Models.Internal.Machine[]>(Models.Internal.MetadataFile.MachineKey); var machines = item.Read<Models.Internal.Machine[]>(Models.Internal.MetadataFile.MachineKey);
if (machines != null && machines.Any()) if (machines != null && machines.Any())
datafile.Game = machines.Select(machine => ConvertMachineFromInternalModel(machine, game)).ToArray(); {
datafile.Game = machines
.Where(m => m != null)
.Select(machine => ConvertMachineFromInternalModel(machine, game))
.ToArray();
}
return datafile; return datafile;
} }
@@ -102,11 +107,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Machine"/> to <cref="Models.Logiqx.GameBase"/> /// Convert from <cref="Models.Internal.Machine"/> to <cref="Models.Logiqx.GameBase"/>
/// </summary> /// </summary>
private static GameBase? ConvertMachineFromInternalModel(Models.Internal.Machine? item, bool game = false) private static GameBase ConvertMachineFromInternalModel(Models.Internal.Machine item, bool game = false)
{ {
if (item == null)
return null;
GameBase gameBase = game ? new Game() : new Machine(); GameBase gameBase = game ? new Game() : new Machine();
gameBase.Name = item.ReadString(Models.Internal.Machine.NameKey); gameBase.Name = item.ReadString(Models.Internal.Machine.NameKey);
@@ -130,37 +132,93 @@ namespace SabreTools.Serialization
gameBase.Category = item.ReadStringArray(Models.Internal.Machine.CategoryKey); gameBase.Category = item.ReadStringArray(Models.Internal.Machine.CategoryKey);
var trurip = item.Read<Trurip>(Models.Internal.Machine.TruripKey); var trurip = item.Read<Trurip>(Models.Internal.Machine.TruripKey);
gameBase.Trurip = trurip; if (trurip != null)
gameBase.Trurip = trurip;
var releases = item.Read<Models.Internal.Release[]>(Models.Internal.Machine.ReleaseKey); var releases = item.Read<Models.Internal.Release[]>(Models.Internal.Machine.ReleaseKey);
gameBase.Release = releases?.Select(ConvertFromInternalModel)?.ToArray(); if (releases != null && releases.Any())
{
gameBase.Release = releases
.Where(r => r != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
var biosSets = item.Read<Models.Internal.BiosSet[]>(Models.Internal.Machine.BiosSetKey); var biosSets = item.Read<Models.Internal.BiosSet[]>(Models.Internal.Machine.BiosSetKey);
gameBase.BiosSet = biosSets?.Select(ConvertFromInternalModel)?.ToArray(); if (biosSets != null && biosSets.Any())
{
gameBase.BiosSet = biosSets
.Where(b => b != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
var roms = item.Read<Models.Internal.Rom[]>(Models.Internal.Machine.RomKey); var roms = item.Read<Models.Internal.Rom[]>(Models.Internal.Machine.RomKey);
gameBase.Rom = roms?.Select(ConvertFromInternalModel)?.ToArray(); if (roms != null && roms.Any())
{
gameBase.Rom = roms
.Where(r => r != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
var disks = item.Read<Models.Internal.Disk[]>(Models.Internal.Machine.DiskKey); var disks = item.Read<Models.Internal.Disk[]>(Models.Internal.Machine.DiskKey);
gameBase.Disk = disks?.Select(ConvertFromInternalModel)?.ToArray(); if (disks != null && disks.Any())
{
gameBase.Disk = disks
.Where(d => d != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
var medias = item.Read<Models.Internal.Media[]>(Models.Internal.Machine.MediaKey); var medias = item.Read<Models.Internal.Media[]>(Models.Internal.Machine.MediaKey);
gameBase.Media = medias?.Select(ConvertFromInternalModel)?.ToArray(); if (medias != null && medias.Any())
{
gameBase.Media = medias
.Where(m => m != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
var deviceRefs = item.Read<Models.Internal.DeviceRef[]>(Models.Internal.Machine.DeviceRefKey); var deviceRefs = item.Read<Models.Internal.DeviceRef[]>(Models.Internal.Machine.DeviceRefKey);
gameBase.DeviceRef = deviceRefs?.Select(ConvertFromInternalModel)?.ToArray(); if (deviceRefs != null && deviceRefs.Any())
{
gameBase.DeviceRef = deviceRefs
.Where(m => m != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
var samples = item.Read<Models.Internal.Sample[]>(Models.Internal.Machine.SampleKey); var samples = item.Read<Models.Internal.Sample[]>(Models.Internal.Machine.SampleKey);
gameBase.Sample = samples?.Select(ConvertFromInternalModel)?.ToArray(); if (samples != null && samples.Any())
{
gameBase.Sample = samples
.Where(m => m != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
var archives = item.Read<Models.Internal.Archive[]>(Models.Internal.Machine.ArchiveKey); var archives = item.Read<Models.Internal.Archive[]>(Models.Internal.Machine.ArchiveKey);
gameBase.Archive = archives?.Select(ConvertFromInternalModel)?.ToArray(); if (archives != null && archives.Any())
{
gameBase.Archive = archives
.Where(m => m != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
var drivers = item.Read<Models.Internal.Driver[]>(Models.Internal.Machine.DriverKey); var driver = item.Read<Models.Internal.Driver>(Models.Internal.Machine.DriverKey);
gameBase.Driver = drivers?.Select(ConvertFromInternalModel)?.ToArray(); if (driver != null)
gameBase.Driver = ConvertFromInternalModel(driver);
var softwareLists = item.Read<Models.Internal.SoftwareList[]>(Models.Internal.Machine.SoftwareListKey); var softwareLists = item.Read<Models.Internal.SoftwareList[]>(Models.Internal.Machine.SoftwareListKey);
gameBase.SoftwareList = softwareLists?.Select(ConvertFromInternalModel)?.ToArray(); if (softwareLists != null && softwareLists.Any())
{
gameBase.SoftwareList = softwareLists
.Where(m => m != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
return gameBase; return gameBase;
} }
@@ -168,11 +226,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Archive"/> to <cref="Models.Logiqx.Archive"/> /// Convert from <cref="Models.Internal.Archive"/> to <cref="Models.Logiqx.Archive"/>
/// </summary> /// </summary>
private static Archive? ConvertFromInternalModel(Models.Internal.Archive? item) private static Archive ConvertFromInternalModel(Models.Internal.Archive item)
{ {
if (item == null)
return null;
var archive = new Archive var archive = new Archive
{ {
Name = item.ReadString(Models.Internal.Archive.NameKey), Name = item.ReadString(Models.Internal.Archive.NameKey),
@@ -183,11 +238,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.BiosSet"/> to <cref="Models.Logiqx.BiosSet"/> /// Convert from <cref="Models.Internal.BiosSet"/> to <cref="Models.Logiqx.BiosSet"/>
/// </summary> /// </summary>
private static BiosSet? ConvertFromInternalModel(Models.Internal.BiosSet? item) private static BiosSet ConvertFromInternalModel(Models.Internal.BiosSet item)
{ {
if (item == null)
return null;
var biosset = new BiosSet var biosset = new BiosSet
{ {
Name = item.ReadString(Models.Internal.BiosSet.NameKey), Name = item.ReadString(Models.Internal.BiosSet.NameKey),
@@ -200,11 +252,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.DeviceRef"/> to <cref="Models.Logiqx.DeviceRef"/> /// Convert from <cref="Models.Internal.DeviceRef"/> to <cref="Models.Logiqx.DeviceRef"/>
/// </summary> /// </summary>
private static DeviceRef? ConvertFromInternalModel(Models.Internal.DeviceRef? item) private static DeviceRef ConvertFromInternalModel(Models.Internal.DeviceRef item)
{ {
if (item == null)
return null;
var deviceRef = new DeviceRef var deviceRef = new DeviceRef
{ {
Name = item.ReadString(Models.Internal.DipSwitch.NameKey), Name = item.ReadString(Models.Internal.DipSwitch.NameKey),
@@ -215,11 +264,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Disk"/> to <cref="Models.Logiqx.Disk"/> /// Convert from <cref="Models.Internal.Disk"/> to <cref="Models.Logiqx.Disk"/>
/// </summary> /// </summary>
private static Disk? ConvertFromInternalModel(Models.Internal.Disk? item) private static Disk ConvertFromInternalModel(Models.Internal.Disk item)
{ {
if (item == null)
return null;
var disk = new Disk var disk = new Disk
{ {
Name = item.ReadString(Models.Internal.Disk.NameKey), Name = item.ReadString(Models.Internal.Disk.NameKey),
@@ -235,11 +281,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Driver"/> to <cref="Models.Logiqx.Driver"/> /// Convert from <cref="Models.Internal.Driver"/> to <cref="Models.Logiqx.Driver"/>
/// </summary> /// </summary>
private static Driver? ConvertFromInternalModel(Models.Internal.Driver? item) private static Driver ConvertFromInternalModel(Models.Internal.Driver item)
{ {
if (item == null)
return null;
var driver = new Driver var driver = new Driver
{ {
Status = item.ReadString(Models.Internal.Driver.StatusKey), Status = item.ReadString(Models.Internal.Driver.StatusKey),
@@ -257,11 +300,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Media"/> to <cref="Models.Logiqx.Media"/> /// Convert from <cref="Models.Internal.Media"/> to <cref="Models.Logiqx.Media"/>
/// </summary> /// </summary>
private static Media? ConvertFromInternalModel(Models.Internal.Media? item) private static Media ConvertFromInternalModel(Models.Internal.Media item)
{ {
if (item == null)
return null;
var media = new Media var media = new Media
{ {
Name = item.ReadString(Models.Internal.Media.NameKey), Name = item.ReadString(Models.Internal.Media.NameKey),
@@ -276,11 +316,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Release"/> to <cref="Models.Logiqx.Release"/> /// Convert from <cref="Models.Internal.Release"/> to <cref="Models.Logiqx.Release"/>
/// </summary> /// </summary>
private static Release? ConvertFromInternalModel(Models.Internal.Release? item) private static Release ConvertFromInternalModel(Models.Internal.Release item)
{ {
if (item == null)
return null;
var release = new Release var release = new Release
{ {
Name = item.ReadString(Models.Internal.Release.NameKey), Name = item.ReadString(Models.Internal.Release.NameKey),
@@ -295,7 +332,7 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Rom"/> to <cref="Models.Logiqx.Rom"/> /// Convert from <cref="Models.Internal.Rom"/> to <cref="Models.Logiqx.Rom"/>
/// </summary> /// </summary>
private static Rom? ConvertFromInternalModel(Models.Internal.Rom? item) private static Rom ConvertFromInternalModel(Models.Internal.Rom item)
{ {
if (item == null) if (item == null)
return null; return null;
@@ -327,11 +364,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Sample"/> to <cref="Models.Logiqx.Sample"/> /// Convert from <cref="Models.Internal.Sample"/> to <cref="Models.Logiqx.Sample"/>
/// </summary> /// </summary>
private static Sample? ConvertFromInternalModel(Models.Internal.Sample? item) private static Sample ConvertFromInternalModel(Models.Internal.Sample item)
{ {
if (item == null)
return null;
var sample = new Sample var sample = new Sample
{ {
Name = item.ReadString(Models.Internal.Sample.NameKey), Name = item.ReadString(Models.Internal.Sample.NameKey),
@@ -342,11 +376,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.SoftwareList"/> to <cref="Models.Logiqx.SoftwareList"/> /// Convert from <cref="Models.Internal.SoftwareList"/> to <cref="Models.Logiqx.SoftwareList"/>
/// </summary> /// </summary>
private static SoftwareList? ConvertFromInternalModel(Models.Internal.SoftwareList? item) private static SoftwareList ConvertFromInternalModel(Models.Internal.SoftwareList item)
{ {
if (item == null)
return null;
var softwareList = new SoftwareList var softwareList = new SoftwareList
{ {
Tag = item.ReadString(Models.Internal.SoftwareList.TagKey), Tag = item.ReadString(Models.Internal.SoftwareList.TagKey),

View File

@@ -1,3 +1,5 @@
using System;
using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using SabreTools.Models.Logiqx; using SabreTools.Models.Logiqx;
@@ -22,16 +24,34 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Logiqx.Datafile"/> to <cref="Models.Internal.MetadataFile"/> /// Convert from <cref="Models.Logiqx.Datafile"/> to <cref="Models.Internal.MetadataFile"/>
/// </summary> /// </summary>
public static Models.Internal.MetadataFile ConvertToInternalModel(Datafile item) public static Models.Internal.MetadataFile? ConvertToInternalModel(Datafile? item)
{ {
if (item == null)
return null;
var metadataFile = new Models.Internal.MetadataFile var metadataFile = new Models.Internal.MetadataFile
{ {
[Models.Internal.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item), [Models.Internal.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item),
}; };
// TODO: Handle Dir items var machines = new List<Models.Internal.Machine>();
if (item?.Game != null && item.Game.Any())
metadataFile[Models.Internal.MetadataFile.MachineKey] = item.Game.Select(ConvertMachineToInternalModel).ToArray(); if (item.Game != null && item.Game.Any())
{
machines.AddRange(item.Game
.Where(g => g != null)
.Select(ConvertMachineToInternalModel));
}
if (item.Dir != null && item.Dir.Any())
{
machines.AddRange(item.Dir
.Where(d => d != null)
.SelectMany(ConvertDirToInternalModel));
}
if (machines.Any())
metadataFile[Models.Internal.MetadataFile.MachineKey] = machines.ToArray();
return metadataFile; return metadataFile;
} }
@@ -41,7 +61,7 @@ namespace SabreTools.Serialization
/// </summary> /// </summary>
private static Models.Internal.Header ConvertHeaderToInternalModel(Datafile item) private static Models.Internal.Header ConvertHeaderToInternalModel(Datafile item)
{ {
var header = ConvertHeaderToInternalModel(item.Header); var header = item.Header != null ? ConvertHeaderToInternalModel(item.Header) : new Models.Internal.Header();
header[Models.Internal.Header.BuildKey] = item.Build; header[Models.Internal.Header.BuildKey] = item.Build;
header[Models.Internal.Header.DebugKey] = item.Debug; header[Models.Internal.Header.DebugKey] = item.Debug;
@@ -94,6 +114,25 @@ namespace SabreTools.Serialization
return header; return header;
} }
/// <summary>
/// Convert from <cref="Models.Logiqx.Dir"/> to an array of <cref="Models.Internal.Machine"/>
/// </summary>
private static Models.Internal.Machine[] ConvertDirToInternalModel(Dir item)
{
if (item.Game == null || !item.Game.Any())
return Array.Empty<Models.Internal.Machine>();
return item.Game
.Where(g => g != null)
.Select(game =>
{
var machine = ConvertMachineToInternalModel(game);
machine[Models.Internal.Machine.DirNameKey] = item.Name;
return machine;
})
.ToArray();
}
/// <summary> /// <summary>
/// Convert from <cref="Models.Logiqx.GameBase"/> to <cref="Models.Internal.Machine"/> /// Convert from <cref="Models.Logiqx.GameBase"/> to <cref="Models.Internal.Machine"/>
/// </summary> /// </summary>
@@ -147,8 +186,8 @@ namespace SabreTools.Serialization
if (item.Archive != null && item.Archive.Any()) if (item.Archive != null && item.Archive.Any())
machine[Models.Internal.Machine.ArchiveKey] = item.Archive.Select(ConvertToInternalModel).ToArray(); machine[Models.Internal.Machine.ArchiveKey] = item.Archive.Select(ConvertToInternalModel).ToArray();
if (item.Driver != null && item.Driver.Any()) if (item.Driver != null)
machine[Models.Internal.Machine.DriverKey] = item.Driver.Select(ConvertToInternalModel).ToArray(); machine[Models.Internal.Machine.DriverKey] = ConvertToInternalModel(item.Driver);
if (item.SoftwareList != null && item.SoftwareList.Any()) if (item.SoftwareList != null && item.SoftwareList.Any())
machine[Models.Internal.Machine.SoftwareListKey] = item.SoftwareList.Select(ConvertToInternalModel).ToArray(); machine[Models.Internal.Machine.SoftwareListKey] = item.SoftwareList.Select(ConvertToInternalModel).ToArray();

View File

@@ -23,7 +23,15 @@ namespace SabreTools.Serialization
var machines = item.Read<Models.Internal.Machine[]>(Models.Internal.MetadataFile.MachineKey); var machines = item.Read<Models.Internal.Machine[]>(Models.Internal.MetadataFile.MachineKey);
if (machines != null && machines.Any()) if (machines != null && machines.Any())
dat.Games = new Games { Game = machines.Select(ConvertMachineFromInternalModel).ToArray() }; {
dat.Games = new Games
{
Game = machines
.Where(m => m != null)
.Select(ConvertMachineFromInternalModel)
.ToArray()
};
}
return dat; return dat;
} }
@@ -31,11 +39,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Header"/> to <cref="Models.OfflineList.Dat"/> /// Convert from <cref="Models.Internal.Header"/> to <cref="Models.OfflineList.Dat"/>
/// </summary> /// </summary>
private static Dat? ConvertHeaderFromInternalModel(Models.Internal.Header? item) private static Dat ConvertHeaderFromInternalModel(Models.Internal.Header item)
{ {
if (item == null)
return null;
var dat = new Dat var dat = new Dat
{ {
NoNamespaceSchemaLocation = item.ReadString(Models.Internal.Header.SchemaLocationKey), NoNamespaceSchemaLocation = item.ReadString(Models.Internal.Header.SchemaLocationKey),
@@ -83,11 +88,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Machine"/> to <cref="Models.OfflineList.Game"/> /// Convert from <cref="Models.Internal.Machine"/> to <cref="Models.OfflineList.Game"/>
/// </summary> /// </summary>
private static Game? ConvertMachineFromInternalModel(Models.Internal.Machine? item) private static Game ConvertMachineFromInternalModel(Models.Internal.Machine item)
{ {
if (item == null)
return null;
var game = new Game var game = new Game
{ {
ImageNumber = item.ReadString(Models.Internal.Machine.ImageNumberKey), ImageNumber = item.ReadString(Models.Internal.Machine.ImageNumberKey),
@@ -105,11 +107,19 @@ namespace SabreTools.Serialization
}; };
var roms = item.Read<Models.Internal.Rom[]>(Models.Internal.Machine.RomKey); var roms = item.Read<Models.Internal.Rom[]>(Models.Internal.Machine.RomKey);
game.RomSize = roms? if (roms != null && roms.Any())
.Select(rom => rom.ReadString(Models.Internal.Rom.SizeKey))? {
.FirstOrDefault(s => s != null); game.RomSize = roms
var romCRCs = roms?.Select(ConvertFromInternalModel).ToArray(); .Select(rom => rom.ReadString(Models.Internal.Rom.SizeKey))
game.Files = new Files { RomCRC = romCRCs }; .FirstOrDefault(s => s != null);
var romCRCs = roms
.Where(r => r != null)
.Select(ConvertFromInternalModel)
.ToArray();
game.Files = new Files { RomCRC = romCRCs };
}
return game; return game;
} }
@@ -117,11 +127,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Rom"/> to <cref="Models.OfflineList.FileRomCRC"/> /// Convert from <cref="Models.Internal.Rom"/> to <cref="Models.OfflineList.FileRomCRC"/>
/// </summary> /// </summary>
private static FileRomCRC? ConvertFromInternalModel(Models.Internal.Rom? item) private static FileRomCRC ConvertFromInternalModel(Models.Internal.Rom item)
{ {
if (item == null)
return null;
var fileRomCRC = new FileRomCRC var fileRomCRC = new FileRomCRC
{ {
Extension = item.ReadString(Models.Internal.Rom.ExtensionKey), Extension = item.ReadString(Models.Internal.Rom.ExtensionKey),

View File

@@ -13,15 +13,23 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.OfflineList.Dat"/> to <cref="Models.Internal.MetadataFile"/> /// Convert from <cref="Models.OfflineList.Dat"/> to <cref="Models.Internal.MetadataFile"/>
/// </summary> /// </summary>
public static Models.Internal.MetadataFile ConvertToInternalModel(Dat item) public static Models.Internal.MetadataFile? ConvertToInternalModel(Dat? item)
{ {
if (item == null)
return null;
var metadataFile = new Models.Internal.MetadataFile var metadataFile = new Models.Internal.MetadataFile
{ {
[Models.Internal.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item), [Models.Internal.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item),
}; };
if (item?.Games?.Game != null && item.Games.Game.Any()) if (item?.Games?.Game != null && item.Games.Game.Any())
metadataFile[Models.Internal.MetadataFile.MachineKey] = item.Games.Game.Select(ConvertMachineToInternalModel).ToArray(); {
metadataFile[Models.Internal.MetadataFile.MachineKey] = item.Games.Game
.Where(g => g != null)
.Select(ConvertMachineToInternalModel)
.ToArray();
}
return metadataFile; return metadataFile;
} }
@@ -82,12 +90,15 @@ namespace SabreTools.Serialization
if (item.Files?.RomCRC != null && item.Files.RomCRC.Any()) if (item.Files?.RomCRC != null && item.Files.RomCRC.Any())
{ {
machine[Models.Internal.Machine.RomKey] = item.Files.RomCRC.Select(romCRC => machine[Models.Internal.Machine.RomKey] = item.Files.RomCRC
{ .Where(r => r != null)
var rom = ConvertToInternalModel(romCRC); .Select(romCRC =>
rom[Models.Internal.Rom.SizeKey] = item.RomSize; {
return rom; var rom = ConvertToInternalModel(romCRC);
}).ToArray(); rom[Models.Internal.Rom.SizeKey] = item.RomSize;
return rom;
})
.ToArray();
} }
return machine; return machine;

View File

@@ -23,7 +23,12 @@ namespace SabreTools.Serialization
var machines = item.Read<Models.Internal.Machine[]>(Models.Internal.MetadataFile.MachineKey); var machines = item.Read<Models.Internal.Machine[]>(Models.Internal.MetadataFile.MachineKey);
if (machines != null && machines.Any()) if (machines != null && machines.Any())
softwareDb.Software = machines.Select(ConvertMachineFromInternalModel).ToArray(); {
softwareDb.Software = machines
.Where(m => m != null)
.Select(ConvertMachineFromInternalModel)
.ToArray();
}
return softwareDb; return softwareDb;
} }
@@ -31,11 +36,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Header"/> to <cref="Models.OpenMSX.SoftwareDb"/> /// Convert from <cref="Models.Internal.Header"/> to <cref="Models.OpenMSX.SoftwareDb"/>
/// </summary> /// </summary>
private static SoftwareDb? ConvertHeaderFromInternalModel(Models.Internal.Header? item) private static SoftwareDb ConvertHeaderFromInternalModel(Models.Internal.Header item)
{ {
if (item == null)
return null;
var softwareDb = new SoftwareDb var softwareDb = new SoftwareDb
{ {
Timestamp = item.ReadString(Models.Internal.Header.TimestampKey), Timestamp = item.ReadString(Models.Internal.Header.TimestampKey),
@@ -46,11 +48,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Machine"/> to <cref="Models.OpenMSX.Software"/> /// Convert from <cref="Models.Internal.Machine"/> to <cref="Models.OpenMSX.Software"/>
/// </summary> /// </summary>
private static Software? ConvertMachineFromInternalModel(Models.Internal.Machine? item) private static Software ConvertMachineFromInternalModel(Models.Internal.Machine item)
{ {
if (item == null)
return null;
var game = new Software var game = new Software
{ {
Title = item.ReadString(Models.Internal.Machine.NameKey), Title = item.ReadString(Models.Internal.Machine.NameKey),
@@ -62,7 +61,13 @@ namespace SabreTools.Serialization
}; };
var dumps = item.Read<Models.Internal.Dump[]>(Models.Internal.Machine.DumpKey); var dumps = item.Read<Models.Internal.Dump[]>(Models.Internal.Machine.DumpKey);
game.Dump = dumps?.Select(ConvertFromInternalModel)?.ToArray(); if (dumps != null && dumps.Any())
{
game.Dump = dumps
.Where(d => d != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
return game; return game;
} }
@@ -70,24 +75,25 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Dump"/> to <cref="Models.OpenMSX.Dump"/> /// Convert from <cref="Models.Internal.Dump"/> to <cref="Models.OpenMSX.Dump"/>
/// </summary> /// </summary>
private static Dump? ConvertFromInternalModel(Models.Internal.Dump? item) private static Dump ConvertFromInternalModel(Models.Internal.Dump item)
{ {
if (item == null)
return null;
var dump = new Dump(); var dump = new Dump();
var original = item.Read<Models.Internal.Original>(Models.Internal.Dump.OriginalKey); var original = item.Read<Models.Internal.Original>(Models.Internal.Dump.OriginalKey);
dump.Original = ConvertFromInternalModel(original); if (original != null)
dump.Original = ConvertFromInternalModel(original);
var rom = item.Read<Models.Internal.Rom>(Models.Internal.Dump.RomKey); var rom = item.Read<Models.Internal.Rom>(Models.Internal.Dump.RomKey);
dump.Rom = ConvertRomFromInternalModel(rom); if (rom != null)
dump.Rom = ConvertRomFromInternalModel(rom);
var megaRom = item.Read<Models.Internal.Rom>(Models.Internal.Dump.MegaRomKey); var megaRom = item.Read<Models.Internal.Rom>(Models.Internal.Dump.MegaRomKey);
dump.Rom = ConvertMegaRomFromInternalModel(megaRom); if (megaRom != null)
dump.Rom = ConvertMegaRomFromInternalModel(megaRom);
var sccPlusCart = item.Read<Models.Internal.Rom>(Models.Internal.Dump.SCCPlusCartKey); var sccPlusCart = item.Read<Models.Internal.Rom>(Models.Internal.Dump.SCCPlusCartKey);
dump.Rom = ConvertSCCPlusCartFromInternalModel(sccPlusCart); if (sccPlusCart != null)
dump.Rom = ConvertSCCPlusCartFromInternalModel(sccPlusCart);
return dump; return dump;
} }
@@ -95,11 +101,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Rom"/> to <cref="Models.OpenMSX.MegaRom"/> /// Convert from <cref="Models.Internal.Rom"/> to <cref="Models.OpenMSX.MegaRom"/>
/// </summary> /// </summary>
private static MegaRom? ConvertMegaRomFromInternalModel(Models.Internal.Rom? item) private static MegaRom ConvertMegaRomFromInternalModel(Models.Internal.Rom item)
{ {
if (item == null)
return null;
var megaRom = new MegaRom var megaRom = new MegaRom
{ {
Start = item.ReadString(Models.Internal.Rom.StartKey), Start = item.ReadString(Models.Internal.Rom.StartKey),
@@ -113,11 +116,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Original"/> to <cref="Models.OpenMSX.Original"/> /// Convert from <cref="Models.Internal.Original"/> to <cref="Models.OpenMSX.Original"/>
/// </summary> /// </summary>
private static Original? ConvertFromInternalModel(Models.Internal.Original? item) private static Original ConvertFromInternalModel(Models.Internal.Original item)
{ {
if (item == null)
return null;
var original = new Original var original = new Original
{ {
Value = item.ReadString(Models.Internal.Original.ValueKey), Value = item.ReadString(Models.Internal.Original.ValueKey),
@@ -129,11 +129,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Rom"/> to <cref="Models.OpenMSX.Rom"/> /// Convert from <cref="Models.Internal.Rom"/> to <cref="Models.OpenMSX.Rom"/>
/// </summary> /// </summary>
private static Rom? ConvertRomFromInternalModel(Models.Internal.Rom? item) private static Rom ConvertRomFromInternalModel(Models.Internal.Rom item)
{ {
if (item == null)
return null;
var rom = new Rom var rom = new Rom
{ {
Start = item.ReadString(Models.Internal.Rom.StartKey), Start = item.ReadString(Models.Internal.Rom.StartKey),
@@ -147,11 +144,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Rom"/> to <cref="Models.OpenMSX.SCCPlusCart"/> /// Convert from <cref="Models.Internal.Rom"/> to <cref="Models.OpenMSX.SCCPlusCart"/>
/// </summary> /// </summary>
private static SCCPlusCart? ConvertSCCPlusCartFromInternalModel(Models.Internal.Rom? item) private static SCCPlusCart ConvertSCCPlusCartFromInternalModel(Models.Internal.Rom item)
{ {
if (item == null)
return null;
var sccPlusCart = new SCCPlusCart var sccPlusCart = new SCCPlusCart
{ {
Start = item.ReadString(Models.Internal.Rom.StartKey), Start = item.ReadString(Models.Internal.Rom.StartKey),

View File

@@ -22,15 +22,23 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.OpenMSX.SoftwareDb"/> to <cref="Models.Internal.MetadataFile"/> /// Convert from <cref="Models.OpenMSX.SoftwareDb"/> to <cref="Models.Internal.MetadataFile"/>
/// </summary> /// </summary>
public static Models.Internal.MetadataFile ConvertToInternalModel(SoftwareDb item) public static Models.Internal.MetadataFile? ConvertToInternalModel(SoftwareDb? item)
{ {
if (item == null)
return null;
var metadataFile = new Models.Internal.MetadataFile var metadataFile = new Models.Internal.MetadataFile
{ {
[Models.Internal.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item), [Models.Internal.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item),
}; };
if (item?.Software != null && item.Software.Any()) if (item?.Software != null && item.Software.Any())
metadataFile[Models.Internal.MetadataFile.MachineKey] = item.Software.Select(ConvertMachineToInternalModel).ToArray(); {
metadataFile[Models.Internal.MetadataFile.MachineKey] = item.Software
.Where(s => s != null)
.Select(ConvertMachineToInternalModel)
.ToArray();
}
return metadataFile; return metadataFile;
} }
@@ -63,7 +71,12 @@ namespace SabreTools.Serialization
}; };
if (item.Dump != null && item.Dump.Any()) if (item.Dump != null && item.Dump.Any())
machine[Models.Internal.Machine.DumpKey] = item.Dump.Select(ConvertToInternalModel).ToArray(); {
machine[Models.Internal.Machine.DumpKey] = item.Dump
.Where(d => d != null)
.Select(ConvertToInternalModel)
.ToArray();
}
return machine; return machine;
} }
@@ -78,19 +91,22 @@ namespace SabreTools.Serialization
if (item.Original != null) if (item.Original != null)
dump[Models.Internal.Dump.OriginalKey] = ConvertToInternalModel(item.Original); dump[Models.Internal.Dump.OriginalKey] = ConvertToInternalModel(item.Original);
switch (item.Rom) if (item.Rom != null)
{ {
case Rom rom: switch (item.Rom)
dump[Models.Internal.Dump.RomKey] = ConvertToInternalModel(rom); {
break; case Rom rom:
dump[Models.Internal.Dump.RomKey] = ConvertToInternalModel(rom);
break;
case MegaRom megaRom: case MegaRom megaRom:
dump[Models.Internal.Dump.MegaRomKey] = ConvertToInternalModel(megaRom); dump[Models.Internal.Dump.MegaRomKey] = ConvertToInternalModel(megaRom);
break; break;
case SCCPlusCart sccPlusCart: case SCCPlusCart sccPlusCart:
dump[Models.Internal.Dump.SCCPlusCartKey] = ConvertToInternalModel(sccPlusCart); dump[Models.Internal.Dump.SCCPlusCartKey] = ConvertToInternalModel(sccPlusCart);
break; break;
}
} }
return dump; return dump;

View File

@@ -1,3 +1,4 @@
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
@@ -236,7 +237,15 @@ namespace SabreTools.Serialization
var machines = item.Read<Models.Internal.Machine[]>(Models.Internal.MetadataFile.MachineKey); var machines = item.Read<Models.Internal.Machine[]>(Models.Internal.MetadataFile.MachineKey);
if (machines != null && machines.Any()) if (machines != null && machines.Any())
metadataFile.Games = new Games { Rom = machines.SelectMany(ConvertMachineFromInternalModel).ToArray() }; {
metadataFile.Games = new Games
{
Rom = machines
.Where(m => m != null)
.SelectMany(ConvertMachineFromInternalModel)
.ToArray()
};
}
return metadataFile; return metadataFile;
} }
@@ -244,11 +253,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Header"/> to <cref="Models.RomCenter.MetadataFile"/> /// Convert from <cref="Models.Internal.Header"/> to <cref="Models.RomCenter.MetadataFile"/>
/// </summary> /// </summary>
private static MetadataFile? ConvertHeaderFromInternalModel(Models.Internal.Header? item) private static MetadataFile ConvertHeaderFromInternalModel(Models.Internal.Header item)
{ {
if (item == null)
return null;
var metadataFile = new MetadataFile(); var metadataFile = new MetadataFile();
if (item.ContainsKey(Models.Internal.Header.AuthorKey) if (item.ContainsKey(Models.Internal.Header.AuthorKey)
@@ -300,23 +306,23 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Machine"/> to an array of <cref="Models.RomCenter.Rom"/> /// Convert from <cref="Models.Internal.Machine"/> to an array of <cref="Models.RomCenter.Rom"/>
/// </summary> /// </summary>
private static Rom?[]? ConvertMachineFromInternalModel(Models.Internal.Machine? item) private static Rom[] ConvertMachineFromInternalModel(Models.Internal.Machine item)
{ {
if (item == null)
return null;
var roms = item.Read<Models.Internal.Rom[]>(Models.Internal.Machine.RomKey); var roms = item.Read<Models.Internal.Rom[]>(Models.Internal.Machine.RomKey);
return roms?.Select(rom => ConvertFromInternalModel(rom, item))?.ToArray(); if (roms == null)
return Array.Empty<Rom>();
return roms
.Where(r => r != null)
.Select(rom => ConvertFromInternalModel(rom, item))
.ToArray();
} }
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Rom"/> to <cref="Models.RomCenter.Rom"/> /// Convert from <cref="Models.Internal.Rom"/> to <cref="Models.RomCenter.Rom"/>
/// </summary> /// </summary>
private static Rom? ConvertFromInternalModel(Models.Internal.Rom? item, Models.Internal.Machine? parent) private static Rom ConvertFromInternalModel(Models.Internal.Rom item, Models.Internal.Machine parent)
{ {
if (item == null)
return null;
var row = new Rom var row = new Rom
{ {
RomName = item.ReadString(Models.Internal.Rom.NameKey), RomName = item.ReadString(Models.Internal.Rom.NameKey),
@@ -324,10 +330,10 @@ namespace SabreTools.Serialization
RomSize = item.ReadString(Models.Internal.Rom.SizeKey), RomSize = item.ReadString(Models.Internal.Rom.SizeKey),
MergeName = item.ReadString(Models.Internal.Rom.MergeKey), MergeName = item.ReadString(Models.Internal.Rom.MergeKey),
ParentName = parent?.ReadString(Models.Internal.Machine.RomOfKey), ParentName = parent.ReadString(Models.Internal.Machine.RomOfKey),
//ParentDescription = parent?.ReadString(Models.Internal.Machine.ParentDescriptionKey), // This is unmappable //ParentDescription = parent.ReadString(Models.Internal.Machine.ParentDescriptionKey), // This is unmappable
GameName = parent?.ReadString(Models.Internal.Machine.NameKey), GameName = parent.ReadString(Models.Internal.Machine.NameKey),
GameDescription = parent?.ReadString(Models.Internal.Machine.DescriptionKey), GameDescription = parent.ReadString(Models.Internal.Machine.DescriptionKey),
}; };
return row; return row;
} }

View File

@@ -178,15 +178,22 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.RomCenter.MetadataFile"/> to <cref="Models.Internal.MetadataFile"/> /// Convert from <cref="Models.RomCenter.MetadataFile"/> to <cref="Models.Internal.MetadataFile"/>
/// </summary> /// </summary>
public static Models.Internal.MetadataFile ConvertToInternalModel(MetadataFile item) public static Models.Internal.MetadataFile? ConvertToInternalModel(MetadataFile? item)
{ {
if (item == null)
return null;
var metadataFile = new Models.Internal.MetadataFile var metadataFile = new Models.Internal.MetadataFile
{ {
[Models.Internal.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item), [Models.Internal.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item),
}; };
if (item?.Games?.Rom != null && item.Games.Rom.Any()) if (item?.Games?.Rom != null && item.Games.Rom.Any())
metadataFile[Models.Internal.MetadataFile.MachineKey] = item.Games.Rom.Select(ConvertMachineToInternalModel).ToArray(); {
metadataFile[Models.Internal.MetadataFile.MachineKey] = item.Games.Rom
.Where(r => r != null)
.Select(ConvertMachineToInternalModel).ToArray();
}
return metadataFile; return metadataFile;
} }

View File

@@ -135,7 +135,12 @@ namespace SabreTools.Serialization
var machines = item.Read<Models.Internal.Machine[]>(Models.Internal.MetadataFile.MachineKey); var machines = item.Read<Models.Internal.Machine[]>(Models.Internal.MetadataFile.MachineKey);
if (machines != null && machines.Any()) if (machines != null && machines.Any())
metadataFile.Row = machines.SelectMany(ConvertMachineFromInternalModel).ToArray(); {
metadataFile.Row = machines
.Where(m => m != null)
.SelectMany(ConvertMachineFromInternalModel)
.ToArray();
}
return metadataFile; return metadataFile;
} }
@@ -143,11 +148,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Header"/> to <cref="Models.SeparatedValue.MetadataFile"/> /// Convert from <cref="Models.Internal.Header"/> to <cref="Models.SeparatedValue.MetadataFile"/>
/// </summary> /// </summary>
private static MetadataFile? ConvertHeaderFromInternalModel(Models.Internal.Header? item) private static MetadataFile ConvertHeaderFromInternalModel(Models.Internal.Header item)
{ {
if (item == null)
return null;
var metadataFile = new MetadataFile var metadataFile = new MetadataFile
{ {
Header = item.ReadStringArray(Models.Internal.Header.HeaderKey), Header = item.ReadStringArray(Models.Internal.Header.HeaderKey),
@@ -158,24 +160,33 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Machine"/> to an array of <cref="Models.SeparatedValue.Row"/> /// Convert from <cref="Models.Internal.Machine"/> to an array of <cref="Models.SeparatedValue.Row"/>
/// </summary> /// </summary>
private static Row[]? ConvertMachineFromInternalModel(Models.Internal.Machine? item) private static Row[] ConvertMachineFromInternalModel(Models.Internal.Machine item)
{ {
if (item == null)
return null;
var rowItems = new List<Row>(); var rowItems = new List<Row>();
var roms = item.Read<Models.Internal.Rom[]>(Models.Internal.Machine.RomKey);
if (roms != null && roms.Any())
{
rowItems.AddRange(roms
.Where(r => r != null)
.Select(rom => ConvertFromInternalModel(rom, item)));
}
var disks = item.Read<Models.Internal.Disk[]>(Models.Internal.Machine.DiskKey); var disks = item.Read<Models.Internal.Disk[]>(Models.Internal.Machine.DiskKey);
if (disks != null) if (disks != null && disks.Any())
rowItems.AddRange(disks.Select(disk => ConvertFromInternalModel(disk, item))); {
rowItems.AddRange(disks
.Where(d => d != null)
.Select(disk => ConvertFromInternalModel(disk, item)));
}
var media = item.Read<Models.Internal.Media[]>(Models.Internal.Machine.MediaKey); var media = item.Read<Models.Internal.Media[]>(Models.Internal.Machine.MediaKey);
if (media != null) if (media != null && media.Any())
rowItems.AddRange(media.Select(medium => ConvertFromInternalModel(medium, item))); {
rowItems.AddRange(media
var roms = item.Read<Models.Internal.Rom[]>(Models.Internal.Machine.RomKey); .Where(m => m != null)
if (roms != null) .Select(medium => ConvertFromInternalModel(medium, item)));
rowItems.AddRange(roms.Select(rom => ConvertFromInternalModel(rom, item))); }
return rowItems.ToArray(); return rowItems.ToArray();
} }
@@ -183,15 +194,12 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Disk"/> to <cref="Models.SeparatedValue.Row"/> /// Convert from <cref="Models.Internal.Disk"/> to <cref="Models.SeparatedValue.Row"/>
/// </summary> /// </summary>
private static Row? ConvertFromInternalModel(Models.Internal.Disk? item, Models.Internal.Machine? parent) private static Row ConvertFromInternalModel(Models.Internal.Disk item, Models.Internal.Machine parent)
{ {
if (item == null)
return null;
var row = new Row var row = new Row
{ {
GameName = parent?.ReadString(Models.Internal.Machine.NameKey), GameName = parent.ReadString(Models.Internal.Machine.NameKey),
Description = parent?.ReadString(Models.Internal.Machine.DescriptionKey), Description = parent.ReadString(Models.Internal.Machine.DescriptionKey),
Type = "disk", Type = "disk",
DiskName = item.ReadString(Models.Internal.Disk.NameKey), DiskName = item.ReadString(Models.Internal.Disk.NameKey),
MD5 = item.ReadString(Models.Internal.Disk.MD5Key), MD5 = item.ReadString(Models.Internal.Disk.MD5Key),
@@ -204,15 +212,12 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Media"/> to <cref="Models.SeparatedValue.Row"/> /// Convert from <cref="Models.Internal.Media"/> to <cref="Models.SeparatedValue.Row"/>
/// </summary> /// </summary>
private static Row? ConvertFromInternalModel(Models.Internal.Media? item, Models.Internal.Machine? parent) private static Row ConvertFromInternalModel(Models.Internal.Media item, Models.Internal.Machine parent)
{ {
if (item == null)
return null;
var row = new Row var row = new Row
{ {
GameName = parent?.ReadString(Models.Internal.Machine.NameKey), GameName = parent.ReadString(Models.Internal.Machine.NameKey),
Description = parent?.ReadString(Models.Internal.Machine.DescriptionKey), Description = parent.ReadString(Models.Internal.Machine.DescriptionKey),
Type = "media", Type = "media",
DiskName = item.ReadString(Models.Internal.Media.NameKey), DiskName = item.ReadString(Models.Internal.Media.NameKey),
MD5 = item.ReadString(Models.Internal.Media.MD5Key), MD5 = item.ReadString(Models.Internal.Media.MD5Key),
@@ -226,11 +231,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Rom"/> to <cref="Models.SeparatedValue.Row"/> /// Convert from <cref="Models.Internal.Rom"/> to <cref="Models.SeparatedValue.Row"/>
/// </summary> /// </summary>
private static Row? ConvertFromInternalModel(Models.Internal.Rom? item, Models.Internal.Machine? parent) private static Row ConvertFromInternalModel(Models.Internal.Rom item, Models.Internal.Machine parent)
{ {
if (item == null)
return null;
var row = new Row var row = new Row
{ {
GameName = parent?.ReadString(Models.Internal.Machine.NameKey), GameName = parent?.ReadString(Models.Internal.Machine.NameKey),

View File

@@ -133,8 +133,11 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.SeparatedValue.MetadataFile"/> to <cref="Models.Internal.MetadataFile"/> /// Convert from <cref="Models.SeparatedValue.MetadataFile"/> to <cref="Models.Internal.MetadataFile"/>
/// </summary> /// </summary>
public static Models.Internal.MetadataFile ConvertToInternalModel(MetadataFile item) public static Models.Internal.MetadataFile? ConvertToInternalModel(MetadataFile? item)
{ {
if (item == null)
return null;
var metadataFile = new Models.Internal.MetadataFile var metadataFile = new Models.Internal.MetadataFile
{ {
[Models.Internal.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item), [Models.Internal.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item),

View File

@@ -23,7 +23,12 @@ namespace SabreTools.Serialization
var machines = item.Read<Models.Internal.Machine[]>(Models.Internal.MetadataFile.MachineKey); var machines = item.Read<Models.Internal.Machine[]>(Models.Internal.MetadataFile.MachineKey);
if (machines != null && machines.Any()) if (machines != null && machines.Any())
metadataFile.Software = machines.Select(ConvertMachineFromInternalModel).ToArray(); {
metadataFile.Software = machines
.Where(m => m != null)
.Select(ConvertMachineFromInternalModel)
.ToArray();
}
return metadataFile; return metadataFile;
} }
@@ -31,11 +36,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Header"/> to <cref="Models.SoftwareList.SoftwareList"/> /// Convert from <cref="Models.Internal.Header"/> to <cref="Models.SoftwareList.SoftwareList"/>
/// </summary> /// </summary>
private static SoftwareList? ConvertHeaderFromInternalModel(Models.Internal.Header? item) private static SoftwareList ConvertHeaderFromInternalModel(Models.Internal.Header item)
{ {
if (item == null)
return null;
var softwareList = new SoftwareList var softwareList = new SoftwareList
{ {
Name = item.ReadString(Models.Internal.Header.NameKey), Name = item.ReadString(Models.Internal.Header.NameKey),
@@ -48,11 +50,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Machine"/> to <cref="Models.SoftwareList.Software"/> /// Convert from <cref="Models.Internal.Machine"/> to <cref="Models.SoftwareList.Software"/>
/// </summary> /// </summary>
private static Software? ConvertMachineFromInternalModel(Models.Internal.Machine? item) private static Software ConvertMachineFromInternalModel(Models.Internal.Machine item)
{ {
if (item == null)
return null;
var software = new Software var software = new Software
{ {
Name = item.ReadString(Models.Internal.Machine.NameKey), Name = item.ReadString(Models.Internal.Machine.NameKey),
@@ -65,13 +64,31 @@ namespace SabreTools.Serialization
}; };
var infos = item.Read<Models.Internal.Info[]>(Models.Internal.Machine.InfoKey); var infos = item.Read<Models.Internal.Info[]>(Models.Internal.Machine.InfoKey);
software.Info = infos?.Select(ConvertFromInternalModel)?.ToArray(); if (infos != null && infos.Any())
{
software.Info = infos
.Where(i => i != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
var sharedFeats = item.Read<Models.Internal.SharedFeat[]>(Models.Internal.Machine.SharedFeatKey); var sharedFeats = item.Read<Models.Internal.SharedFeat[]>(Models.Internal.Machine.SharedFeatKey);
software.SharedFeat = sharedFeats?.Select(ConvertFromInternalModel)?.ToArray(); if (sharedFeats != null && sharedFeats.Any())
{
software.SharedFeat = sharedFeats
.Where(s => s != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
var parts = item.Read<Models.Internal.Part[]>(Models.Internal.Machine.PartKey); var parts = item.Read<Models.Internal.Part[]>(Models.Internal.Machine.PartKey);
software.Part = parts?.Select(ConvertFromInternalModel)?.ToArray(); if (parts != null && parts.Any())
{
software.Part = parts
.Where(p => p != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
return software; return software;
} }
@@ -79,11 +96,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.DataArea"/> to <cref="Models.SoftwareList.DataArea"/> /// Convert from <cref="Models.Internal.DataArea"/> to <cref="Models.SoftwareList.DataArea"/>
/// </summary> /// </summary>
private static DataArea? ConvertFromInternalModel(Models.Internal.DataArea? item) private static DataArea ConvertFromInternalModel(Models.Internal.DataArea item)
{ {
if (item == null)
return null;
var dataArea = new DataArea var dataArea = new DataArea
{ {
Name = item.ReadString(Models.Internal.DataArea.NameKey), Name = item.ReadString(Models.Internal.DataArea.NameKey),
@@ -93,7 +107,13 @@ namespace SabreTools.Serialization
}; };
var roms = item.Read<Models.Internal.Rom[]>(Models.Internal.DataArea.RomKey); var roms = item.Read<Models.Internal.Rom[]>(Models.Internal.DataArea.RomKey);
dataArea.Rom = roms?.Select(ConvertFromInternalModel)?.ToArray(); if (roms != null && roms.Any())
{
dataArea.Rom = roms
.Where(r => r != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
return dataArea; return dataArea;
} }
@@ -101,11 +121,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.DipSwitch"/> to <cref="Models.SoftwareList.DipSwitch"/> /// Convert from <cref="Models.Internal.DipSwitch"/> to <cref="Models.SoftwareList.DipSwitch"/>
/// </summary> /// </summary>
private static DipSwitch? ConvertFromInternalModel(Models.Internal.DipSwitch? item) private static DipSwitch ConvertFromInternalModel(Models.Internal.DipSwitch item)
{ {
if (item == null)
return null;
var dipSwitch = new DipSwitch var dipSwitch = new DipSwitch
{ {
Name = item.ReadString(Models.Internal.DipSwitch.NameKey), Name = item.ReadString(Models.Internal.DipSwitch.NameKey),
@@ -114,7 +131,13 @@ namespace SabreTools.Serialization
}; };
var dipValues = item.Read<Models.Internal.DipValue[]>(Models.Internal.DipSwitch.DipValueKey); var dipValues = item.Read<Models.Internal.DipValue[]>(Models.Internal.DipSwitch.DipValueKey);
dipSwitch.DipValue = dipValues?.Select(ConvertFromInternalModel)?.ToArray(); if (dipValues != null && dipValues.Any())
{
dipSwitch.DipValue = dipValues
.Where(d => d != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
return dipSwitch; return dipSwitch;
} }
@@ -122,11 +145,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.DipValue"/> to <cref="Models.SoftwareList.DipValue"/> /// Convert from <cref="Models.Internal.DipValue"/> to <cref="Models.SoftwareList.DipValue"/>
/// </summary> /// </summary>
private static DipValue? ConvertFromInternalModel(Models.Internal.DipValue? item) private static DipValue ConvertFromInternalModel(Models.Internal.DipValue item)
{ {
if (item == null)
return null;
var dipValue = new DipValue var dipValue = new DipValue
{ {
Name = item.ReadString(Models.Internal.DipValue.NameKey), Name = item.ReadString(Models.Internal.DipValue.NameKey),
@@ -139,11 +159,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Disk"/> to <cref="Models.SoftwareList.Disk"/> /// Convert from <cref="Models.Internal.Disk"/> to <cref="Models.SoftwareList.Disk"/>
/// </summary> /// </summary>
private static Disk? ConvertFromInternalModel(Models.Internal.Disk? item) private static Disk ConvertFromInternalModel(Models.Internal.Disk item)
{ {
if (item == null)
return null;
var disk = new Disk var disk = new Disk
{ {
Name = item.ReadString(Models.Internal.Disk.NameKey), Name = item.ReadString(Models.Internal.Disk.NameKey),
@@ -158,18 +175,21 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.DiskArea"/> to <cref="Models.SoftwareList.DiskArea"/> /// Convert from <cref="Models.Internal.DiskArea"/> to <cref="Models.SoftwareList.DiskArea"/>
/// </summary> /// </summary>
private static DiskArea? ConvertFromInternalModel(Models.Internal.DiskArea? item) private static DiskArea ConvertFromInternalModel(Models.Internal.DiskArea item)
{ {
if (item == null)
return null;
var diskArea = new DiskArea var diskArea = new DiskArea
{ {
Name = item.ReadString(Models.Internal.DiskArea.NameKey), Name = item.ReadString(Models.Internal.DiskArea.NameKey),
}; };
var disks = item.Read<Models.Internal.Disk[]>(Models.Internal.DiskArea.DiskKey); var disks = item.Read<Models.Internal.Disk[]>(Models.Internal.DiskArea.DiskKey);
diskArea.Disk = disks?.Select(ConvertFromInternalModel)?.ToArray(); if (disks != null && disks.Any())
{
diskArea.Disk = disks
.Where(d => d != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
return diskArea; return diskArea;
} }
@@ -177,11 +197,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Feature"/> to <cref="Models.SoftwareList.Feature"/> /// Convert from <cref="Models.Internal.Feature"/> to <cref="Models.SoftwareList.Feature"/>
/// </summary> /// </summary>
private static Feature? ConvertFromInternalModel(Models.Internal.Feature? item) private static Feature ConvertFromInternalModel(Models.Internal.Feature item)
{ {
if (item == null)
return null;
var feature = new Feature var feature = new Feature
{ {
Name = item.ReadString(Models.Internal.Feature.NameKey), Name = item.ReadString(Models.Internal.Feature.NameKey),
@@ -193,11 +210,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Info"/> to <cref="Models.SoftwareList.Info"/> /// Convert from <cref="Models.Internal.Info"/> to <cref="Models.SoftwareList.Info"/>
/// </summary> /// </summary>
private static Info? ConvertFromInternalModel(Models.Internal.Info? item) private static Info ConvertFromInternalModel(Models.Internal.Info item)
{ {
if (item == null)
return null;
var info = new Info var info = new Info
{ {
Name = item.ReadString(Models.Internal.Info.NameKey), Name = item.ReadString(Models.Internal.Info.NameKey),
@@ -209,11 +223,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Part"/> to <cref="Models.SoftwareList.Part"/> /// Convert from <cref="Models.Internal.Part"/> to <cref="Models.SoftwareList.Part"/>
/// </summary> /// </summary>
private static Part? ConvertFromInternalModel(Models.Internal.Part? item) private static Part ConvertFromInternalModel(Models.Internal.Part item)
{ {
if (item == null)
return null;
var part = new Part var part = new Part
{ {
Name = item.ReadString(Models.Internal.Part.NameKey), Name = item.ReadString(Models.Internal.Part.NameKey),
@@ -221,16 +232,40 @@ namespace SabreTools.Serialization
}; };
var features = item.Read<Models.Internal.Feature[]>(Models.Internal.Part.FeatureKey); var features = item.Read<Models.Internal.Feature[]>(Models.Internal.Part.FeatureKey);
part.Feature = features?.Select(ConvertFromInternalModel)?.ToArray(); if (features != null && features.Any())
{
part.Feature = features
.Where(f => f != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
var dataAreas = item.Read<Models.Internal.DataArea[]>(Models.Internal.Part.DataAreaKey); var dataAreas = item.Read<Models.Internal.DataArea[]>(Models.Internal.Part.DataAreaKey);
part.DataArea = dataAreas?.Select(ConvertFromInternalModel)?.ToArray(); if (dataAreas != null && dataAreas.Any())
{
part.DataArea = dataAreas
.Where(d => d != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
var diskAreas = item.Read<Models.Internal.DiskArea[]>(Models.Internal.Part.DiskAreaKey); var diskAreas = item.Read<Models.Internal.DiskArea[]>(Models.Internal.Part.DiskAreaKey);
part.DiskArea = diskAreas?.Select(ConvertFromInternalModel)?.ToArray(); if (diskAreas != null && diskAreas.Any())
{
part.DiskArea = diskAreas
.Where(d => d != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
var dipSwitches = item.Read<Models.Internal.DipSwitch[]>(Models.Internal.Part.DipSwitchKey); var dipSwitches = item.Read<Models.Internal.DipSwitch[]>(Models.Internal.Part.DipSwitchKey);
part.DipSwitch = dipSwitches?.Select(ConvertFromInternalModel)?.ToArray(); if (dipSwitches != null && dipSwitches.Any())
{
part.DipSwitch = dipSwitches
.Where(d => d != null)
.Select(ConvertFromInternalModel)
.ToArray();
}
return part; return part;
} }
@@ -238,11 +273,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.Rom"/> to <cref="Models.SoftwareList.Rom"/> /// Convert from <cref="Models.Internal.Rom"/> to <cref="Models.SoftwareList.Rom"/>
/// </summary> /// </summary>
private static Rom? ConvertFromInternalModel(Models.Internal.Rom? item) private static Rom ConvertFromInternalModel(Models.Internal.Rom item)
{ {
if (item == null)
return null;
var rom = new Rom var rom = new Rom
{ {
Name = item.ReadString(Models.Internal.Rom.NameKey), Name = item.ReadString(Models.Internal.Rom.NameKey),
@@ -261,11 +293,8 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.Internal.SharedFeat"/> to <cref="Models.SoftwareList.SharedFeat"/> /// Convert from <cref="Models.Internal.SharedFeat"/> to <cref="Models.SoftwareList.SharedFeat"/>
/// </summary> /// </summary>
private static SharedFeat? ConvertFromInternalModel(Models.Internal.SharedFeat? item) private static SharedFeat ConvertFromInternalModel(Models.Internal.SharedFeat item)
{ {
if (item == null)
return null;
var sharedFeat = new SharedFeat var sharedFeat = new SharedFeat
{ {
Name = item.ReadString(Models.Internal.SharedFeat.NameKey), Name = item.ReadString(Models.Internal.SharedFeat.NameKey),

View File

@@ -22,15 +22,23 @@ namespace SabreTools.Serialization
/// <summary> /// <summary>
/// Convert from <cref="Models.SoftwareList.SoftwareList"/> to <cref="Models.Internal.MetadataFile"/> /// Convert from <cref="Models.SoftwareList.SoftwareList"/> to <cref="Models.Internal.MetadataFile"/>
/// </summary> /// </summary>
public static Models.Internal.MetadataFile ConvertToInternalModel(SoftwareList item) public static Models.Internal.MetadataFile? ConvertToInternalModel(SoftwareList? item)
{ {
if (item == null)
return null;
var metadataFile = new Models.Internal.MetadataFile var metadataFile = new Models.Internal.MetadataFile
{ {
[Models.Internal.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item), [Models.Internal.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item),
}; };
if (item?.Software != null && item.Software.Any()) if (item?.Software != null && item.Software.Any())
metadataFile[Models.Internal.MetadataFile.MachineKey] = item.Software.Select(ConvertMachineToInternalModel).ToArray(); {
metadataFile[Models.Internal.MetadataFile.MachineKey] = item.Software
.Where(s => s != null)
.Select(ConvertMachineToInternalModel)
.ToArray();
}
return metadataFile; return metadataFile;
} }

View File

@@ -589,10 +589,10 @@ namespace SabreTools.Test.Parser
Assert.Null(item.ADDITIONAL_ELEMENTS); Assert.Null(item.ADDITIONAL_ELEMENTS);
} }
foreach (var item in game.Driver ?? Array.Empty<Models.Logiqx.Driver>()) if (game.Driver != null)
{ {
Assert.Null(item.ADDITIONAL_ATTRIBUTES); Assert.Null(game.Driver.ADDITIONAL_ATTRIBUTES);
Assert.Null(item.ADDITIONAL_ELEMENTS); Assert.Null(game.Driver.ADDITIONAL_ELEMENTS);
} }
foreach (var item in game.SoftwareList ?? Array.Empty<Models.Logiqx.SoftwareList>()) foreach (var item in game.SoftwareList ?? Array.Empty<Models.Logiqx.SoftwareList>())
@@ -664,10 +664,10 @@ namespace SabreTools.Test.Parser
Assert.Null(item.ADDITIONAL_ELEMENTS); Assert.Null(item.ADDITIONAL_ELEMENTS);
} }
foreach (var item in game.Driver ?? Array.Empty<Models.Logiqx.Driver>()) if (game.Driver != null)
{ {
Assert.Null(item.ADDITIONAL_ATTRIBUTES); Assert.Null(game.Driver.ADDITIONAL_ATTRIBUTES);
Assert.Null(item.ADDITIONAL_ELEMENTS); Assert.Null(game.Driver.ADDITIONAL_ELEMENTS);
} }
foreach (var item in game.SoftwareList ?? Array.Empty<Models.Logiqx.SoftwareList>()) foreach (var item in game.SoftwareList ?? Array.Empty<Models.Logiqx.SoftwareList>())