Convert most keys to properties for Machine

This commit is contained in:
Matt Nadareski
2026-04-04 12:21:09 -04:00
parent eb2f5babd9
commit d72c7c9cc0
34 changed files with 405 additions and 580 deletions

View File

@@ -237,9 +237,9 @@ namespace SabreTools.Metadata.DatFiles
// long machineIndex = AddMachineDB(machine);
// Convert items in the machine
if (item.ContainsKey(Data.Models.Metadata.Machine.AdjusterKey))
if (item.Adjuster is not null)
{
var items = item.ReadArray<Data.Models.Metadata.Adjuster>(Data.Models.Metadata.Machine.AdjusterKey) ?? [];
var items = item.Adjuster ?? [];
var filtered = filterRunner is null ? items : Array.FindAll(items, i => filterRunner.Run(item));
Array.ForEach(filtered, item =>
{
@@ -249,9 +249,9 @@ namespace SabreTools.Metadata.DatFiles
});
}
if (item.ContainsKey(Data.Models.Metadata.Machine.ArchiveKey))
if (item.Archive is not null)
{
var items = item.ReadArray<Data.Models.Metadata.Archive>(Data.Models.Metadata.Machine.ArchiveKey) ?? [];
var items = item.Archive ?? [];
var filtered = filterRunner is null ? items : Array.FindAll(items, i => filterRunner.Run(item));
Array.ForEach(filtered, item =>
{
@@ -261,9 +261,9 @@ namespace SabreTools.Metadata.DatFiles
});
}
if (item.ContainsKey(Data.Models.Metadata.Machine.BiosSetKey))
if (item.BiosSet is not null)
{
var items = item.ReadArray<Data.Models.Metadata.BiosSet>(Data.Models.Metadata.Machine.BiosSetKey) ?? [];
var items = item.BiosSet ?? [];
var filtered = filterRunner is null ? items : Array.FindAll(items, i => filterRunner.Run(item));
Array.ForEach(filtered, item =>
{
@@ -273,9 +273,9 @@ namespace SabreTools.Metadata.DatFiles
});
}
if (item.ContainsKey(Data.Models.Metadata.Machine.ChipKey))
if (item.Chip is not null)
{
var items = item.ReadArray<Data.Models.Metadata.Chip>(Data.Models.Metadata.Machine.ChipKey) ?? [];
var items = item.Chip ?? [];
var filtered = filterRunner is null ? items : Array.FindAll(items, i => filterRunner.Run(item));
Array.ForEach(filtered, item =>
{
@@ -285,9 +285,9 @@ namespace SabreTools.Metadata.DatFiles
});
}
if (item.ContainsKey(Data.Models.Metadata.Machine.ConfigurationKey))
if (item.Configuration is not null)
{
var items = item.ReadArray<Data.Models.Metadata.Configuration>(Data.Models.Metadata.Machine.ConfigurationKey) ?? [];
var items = item.Configuration ?? [];
var filtered = filterRunner is null ? items : Array.FindAll(items, i => filterRunner.Run(item));
Array.ForEach(filtered, item =>
{
@@ -297,9 +297,9 @@ namespace SabreTools.Metadata.DatFiles
});
}
if (item.ContainsKey(Data.Models.Metadata.Machine.DeviceKey))
if (item.Device is not null)
{
var items = item.ReadArray<Data.Models.Metadata.Device>(Data.Models.Metadata.Machine.DeviceKey) ?? [];
var items = item.Device ?? [];
var filtered = filterRunner is null ? items : Array.FindAll(items, i => filterRunner.Run(item));
Array.ForEach(filtered, item =>
{
@@ -309,9 +309,9 @@ namespace SabreTools.Metadata.DatFiles
});
}
if (item.ContainsKey(Data.Models.Metadata.Machine.DeviceRefKey))
if (item.DeviceRef is not null)
{
var items = item.ReadArray<Data.Models.Metadata.DeviceRef>(Data.Models.Metadata.Machine.DeviceRefKey) ?? [];
var items = item.DeviceRef ?? [];
// Do not filter these due to later use
Array.ForEach(items, item =>
{
@@ -321,9 +321,9 @@ namespace SabreTools.Metadata.DatFiles
});
}
if (item.ContainsKey(Data.Models.Metadata.Machine.DipSwitchKey))
if (item.DipSwitch is not null)
{
var items = item.ReadArray<Data.Models.Metadata.DipSwitch>(Data.Models.Metadata.Machine.DipSwitchKey) ?? [];
var items = item.DipSwitch ?? [];
var filtered = filterRunner is null ? items : Array.FindAll(items, i => filterRunner.Run(item));
Array.ForEach(filtered, item =>
{
@@ -333,9 +333,9 @@ namespace SabreTools.Metadata.DatFiles
});
}
if (item.ContainsKey(Data.Models.Metadata.Machine.DiskKey))
if (item.Disk is not null)
{
var items = item.ReadArray<Data.Models.Metadata.Disk>(Data.Models.Metadata.Machine.DiskKey) ?? [];
var items = item.Disk ?? [];
var filtered = filterRunner is null ? items : Array.FindAll(items, i => filterRunner.Run(item));
Array.ForEach(filtered, item =>
{
@@ -345,9 +345,9 @@ namespace SabreTools.Metadata.DatFiles
});
}
if (item.ContainsKey(Data.Models.Metadata.Machine.DisplayKey))
if (item.Display is not null)
{
var items = item.ReadArray<Data.Models.Metadata.Display>(Data.Models.Metadata.Machine.DisplayKey) ?? [];
var items = item.Display ?? [];
var filtered = filterRunner is null ? items : Array.FindAll(items, i => filterRunner.Run(item));
Array.ForEach(filtered, item =>
{
@@ -357,21 +357,16 @@ namespace SabreTools.Metadata.DatFiles
});
}
if (item.ContainsKey(Data.Models.Metadata.Machine.DriverKey))
if (item.Driver is not null && filterRunner?.Run(item.Driver) != false)
{
var items = item.ReadArray<Data.Models.Metadata.Driver>(Data.Models.Metadata.Machine.DriverKey) ?? [];
var filtered = filterRunner is null ? items : Array.FindAll(items, i => filterRunner.Run(item));
Array.ForEach(filtered, item =>
{
var datItem = new Driver(item, machine, source);
AddItem(datItem, statsOnly);
// AddItemDB(datItem, machineIndex, sourceIndex, statsOnly);
});
var datItem = new Driver(item.Driver, machine, source);
AddItem(datItem, statsOnly);
// AddItemDB(datItem, machineIndex, sourceIndex, statsOnly);
}
if (item.ContainsKey(Data.Models.Metadata.Machine.DumpKey))
if (item.Dump is not null)
{
var items = item.ReadArray<Data.Models.Metadata.Dump>(Data.Models.Metadata.Machine.DumpKey) ?? [];
var items = item.Dump ?? [];
for (int i = 0; i < items.Length; i++)
{
var datItem = new Rom(items[i], machine, source, i);
@@ -383,9 +378,9 @@ namespace SabreTools.Metadata.DatFiles
}
}
if (item.ContainsKey(Data.Models.Metadata.Machine.FeatureKey))
if (item.Feature is not null)
{
var items = item.ReadArray<Data.Models.Metadata.Feature>(Data.Models.Metadata.Machine.FeatureKey) ?? [];
var items = item.Feature ?? [];
var filtered = filterRunner is null ? items : Array.FindAll(items, i => filterRunner.Run(item));
Array.ForEach(filtered, item =>
{
@@ -395,9 +390,9 @@ namespace SabreTools.Metadata.DatFiles
});
}
if (item.ContainsKey(Data.Models.Metadata.Machine.InfoKey))
if (item.Info is not null)
{
var items = item.ReadArray<Data.Models.Metadata.Info>(Data.Models.Metadata.Machine.InfoKey) ?? [];
var items = item.Info ?? [];
var filtered = filterRunner is null ? items : Array.FindAll(items, i => filterRunner.Run(item));
Array.ForEach(filtered, item =>
{
@@ -407,21 +402,16 @@ namespace SabreTools.Metadata.DatFiles
});
}
if (item.ContainsKey(Data.Models.Metadata.Machine.InputKey))
if (item.Input is not null && filterRunner?.Run(item.Input) != false)
{
var items = item.ReadArray<Data.Models.Metadata.Input>(Data.Models.Metadata.Machine.InputKey) ?? [];
var filtered = filterRunner is null ? items : Array.FindAll(items, i => filterRunner.Run(item));
Array.ForEach(filtered, item =>
{
var datItem = new Input(item, machine, source);
AddItem(datItem, statsOnly);
// AddItemDB(datItem, machineIndex, sourceIndex, statsOnly);
});
var datItem = new Input(item.Input, machine, source);
AddItem(datItem, statsOnly);
// AddItemDB(datItem, machineIndex, sourceIndex, statsOnly);
}
if (item.ContainsKey(Data.Models.Metadata.Machine.MediaKey))
if (item.Media is not null)
{
var items = item.ReadArray<Data.Models.Metadata.Media>(Data.Models.Metadata.Machine.MediaKey) ?? [];
var items = item.Media ?? [];
var filtered = filterRunner is null ? items : Array.FindAll(items, i => filterRunner.Run(item));
Array.ForEach(filtered, item =>
{
@@ -431,15 +421,15 @@ namespace SabreTools.Metadata.DatFiles
});
}
if (item.ContainsKey(Data.Models.Metadata.Machine.PartKey))
if (item.Part is not null)
{
var items = item.ReadArray<Data.Models.Metadata.Part>(Data.Models.Metadata.Machine.PartKey) ?? [];
var items = item.Part ?? [];
ProcessItems(items, machine, machineIndex: 0, source, sourceIndex, statsOnly, filterRunner);
}
if (item.ContainsKey(Data.Models.Metadata.Machine.PortKey))
if (item.Port is not null)
{
var items = item.ReadArray<Data.Models.Metadata.Port>(Data.Models.Metadata.Machine.PortKey) ?? [];
var items = item.Port ?? [];
var filtered = filterRunner is null ? items : Array.FindAll(items, i => filterRunner.Run(item));
Array.ForEach(filtered, item =>
{
@@ -449,9 +439,9 @@ namespace SabreTools.Metadata.DatFiles
});
}
if (item.ContainsKey(Data.Models.Metadata.Machine.RamOptionKey))
if (item.RamOption is not null)
{
var items = item.ReadArray<Data.Models.Metadata.RamOption>(Data.Models.Metadata.Machine.RamOptionKey) ?? [];
var items = item.RamOption ?? [];
var filtered = filterRunner is null ? items : Array.FindAll(items, i => filterRunner.Run(item));
Array.ForEach(filtered, item =>
{
@@ -461,9 +451,9 @@ namespace SabreTools.Metadata.DatFiles
});
}
if (item.ContainsKey(Data.Models.Metadata.Machine.ReleaseKey))
if (item.Release is not null)
{
var items = item.ReadArray<Data.Models.Metadata.Release>(Data.Models.Metadata.Machine.ReleaseKey) ?? [];
var items = item.Release ?? [];
var filtered = filterRunner is null ? items : Array.FindAll(items, i => filterRunner.Run(item));
Array.ForEach(filtered, item =>
{
@@ -473,9 +463,9 @@ namespace SabreTools.Metadata.DatFiles
});
}
if (item.ContainsKey(Data.Models.Metadata.Machine.RomKey))
if (item.Rom is not null)
{
var items = item.ReadArray<Data.Models.Metadata.Rom>(Data.Models.Metadata.Machine.RomKey) ?? [];
var items = item.Rom ?? [];
var filtered = filterRunner is null ? items : Array.FindAll(items, i => filterRunner.Run(item));
Array.ForEach(filtered, item =>
{
@@ -488,9 +478,9 @@ namespace SabreTools.Metadata.DatFiles
});
}
if (item.ContainsKey(Data.Models.Metadata.Machine.SampleKey))
if (item.Sample is not null)
{
var items = item.ReadArray<Data.Models.Metadata.Sample>(Data.Models.Metadata.Machine.SampleKey) ?? [];
var items = item.Sample ?? [];
var filtered = filterRunner is null ? items : Array.FindAll(items, i => filterRunner.Run(item));
Array.ForEach(filtered, item =>
{
@@ -500,9 +490,9 @@ namespace SabreTools.Metadata.DatFiles
});
}
if (item.ContainsKey(Data.Models.Metadata.Machine.SharedFeatKey))
if (item.SharedFeat is not null)
{
var items = item.ReadArray<Data.Models.Metadata.SharedFeat>(Data.Models.Metadata.Machine.SharedFeatKey) ?? [];
var items = item.SharedFeat ?? [];
var filtered = filterRunner is null ? items : Array.FindAll(items, i => filterRunner.Run(item));
Array.ForEach(filtered, item =>
{
@@ -512,9 +502,9 @@ namespace SabreTools.Metadata.DatFiles
});
}
if (item.ContainsKey(Data.Models.Metadata.Machine.SlotKey))
if (item.Slot is not null)
{
var items = item.ReadArray<Data.Models.Metadata.Slot>(Data.Models.Metadata.Machine.SlotKey) ?? [];
var items = item.Slot ?? [];
// Do not filter these due to later use
Array.ForEach(items, item =>
{
@@ -524,9 +514,9 @@ namespace SabreTools.Metadata.DatFiles
});
}
if (item.ContainsKey(Data.Models.Metadata.Machine.SoftwareListKey))
if (item.SoftwareList is not null)
{
var items = item.ReadArray<Data.Models.Metadata.SoftwareList>(Data.Models.Metadata.Machine.SoftwareListKey) ?? [];
var items = item.SoftwareList ?? [];
var filtered = filterRunner is null ? items : Array.FindAll(items, i => filterRunner.Run(item));
Array.ForEach(filtered, item =>
{
@@ -536,21 +526,16 @@ namespace SabreTools.Metadata.DatFiles
});
}
if (item.ContainsKey(Data.Models.Metadata.Machine.SoundKey))
if (item.Sound is not null && filterRunner?.Run(item.Sound) != false)
{
var items = item.ReadArray<Data.Models.Metadata.Sound>(Data.Models.Metadata.Machine.SoundKey) ?? [];
var filtered = filterRunner is null ? items : Array.FindAll(items, i => filterRunner.Run(item));
Array.ForEach(filtered, item =>
{
var datItem = new Sound(item, machine, source);
AddItem(datItem, statsOnly);
// AddItemDB(datItem, machineIndex, sourceIndex, statsOnly);
});
var datItem = new Sound(item.Sound, machine, source);
AddItem(datItem, statsOnly);
// AddItemDB(datItem, machineIndex, sourceIndex, statsOnly);
}
if (item.ContainsKey(Data.Models.Metadata.Machine.VideoKey))
if (item.Video is not null)
{
var items = item.ReadArray<Data.Models.Metadata.Video>(Data.Models.Metadata.Machine.VideoKey) ?? [];
var items = item.Video ?? [];
var filtered = filterRunner is null ? items : Array.FindAll(items, i => filterRunner.Run(item));
Array.ForEach(filtered, item =>
{

View File

@@ -115,43 +115,43 @@ namespace SabreTools.Metadata.DatFiles
{
case DatItems.Formats.Adjuster adjuster:
var adjusterItem = adjuster.GetInternalClone();
EnsureMachineKey<Data.Models.Metadata.Adjuster?>(machine, Data.Models.Metadata.Machine.AdjusterKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.AdjusterKey, adjusterItem);
machine.Adjuster ??= [];
machine.Adjuster = [.. machine.Adjuster, adjusterItem];
break;
case DatItems.Formats.Archive archive:
var archiveItem = archive.GetInternalClone();
EnsureMachineKey<Data.Models.Metadata.Archive?>(machine, Data.Models.Metadata.Machine.ArchiveKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.ArchiveKey, archiveItem);
machine.Archive ??= [];
machine.Archive = [.. machine.Archive, archiveItem];
break;
case DatItems.Formats.BiosSet biosSet:
var biosSetItem = biosSet.GetInternalClone();
EnsureMachineKey<Data.Models.Metadata.BiosSet?>(machine, Data.Models.Metadata.Machine.BiosSetKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.BiosSetKey, biosSetItem);
machine.BiosSet ??= [];
machine.BiosSet = [.. machine.BiosSet, biosSetItem];
break;
case DatItems.Formats.Chip chip:
var chipItem = chip.GetInternalClone();
EnsureMachineKey<Data.Models.Metadata.Chip?>(machine, Data.Models.Metadata.Machine.ChipKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.ChipKey, chipItem);
machine.Chip ??= [];
machine.Chip = [.. machine.Chip, chipItem];
break;
case DatItems.Formats.Configuration configuration:
var configurationItem = configuration.GetInternalClone();
EnsureMachineKey<Data.Models.Metadata.Configuration?>(machine, Data.Models.Metadata.Machine.ConfigurationKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.ConfigurationKey, configurationItem);
machine.Configuration ??= [];
machine.Configuration = [.. machine.Configuration, configurationItem];
break;
case DatItems.Formats.Device device:
var deviceItem = device.GetInternalClone();
EnsureMachineKey<Data.Models.Metadata.Device?>(machine, Data.Models.Metadata.Machine.DeviceKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.DeviceKey, deviceItem);
machine.Device ??= [];
machine.Device = [.. machine.Device, deviceItem];
break;
case DatItems.Formats.DeviceRef deviceRef:
var deviceRefItem = deviceRef.GetInternalClone();
EnsureMachineKey<Data.Models.Metadata.DeviceRef?>(machine, Data.Models.Metadata.Machine.DeviceRefKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.DeviceRefKey, deviceRefItem);
machine.DeviceRef ??= [];
machine.DeviceRef = [.. machine.DeviceRef, deviceRefItem];
break;
case DatItems.Formats.DipSwitch dipSwitch:
var dipSwitchItem = dipSwitch.GetInternalClone();
EnsureMachineKey<Data.Models.Metadata.DipSwitch?>(machine, Data.Models.Metadata.Machine.DipSwitchKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.DipSwitchKey, dipSwitchItem);
machine.DipSwitch ??= [];
machine.DipSwitch = [.. machine.DipSwitch, dipSwitchItem];
// Add Part mapping
if (dipSwitch.Part is not null)
@@ -160,8 +160,8 @@ namespace SabreTools.Metadata.DatFiles
break;
case DatItems.Formats.Disk disk:
var diskItem = disk.GetInternalClone();
EnsureMachineKey<Data.Models.Metadata.Disk?>(machine, Data.Models.Metadata.Machine.DiskKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.DiskKey, diskItem);
machine.Disk ??= [];
machine.Disk = [.. machine.Disk, diskItem];
// Add Part and DiskArea mappings
if (disk.Part is not null && disk.DiskArea is not null)
@@ -174,38 +174,34 @@ namespace SabreTools.Metadata.DatFiles
break;
case DatItems.Formats.Display display:
var displayItem = ProcessItem(display, machine);
EnsureMachineKey<Data.Models.Metadata.Display?>(machine, Data.Models.Metadata.Machine.DisplayKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.DisplayKey, displayItem);
machine.Display ??= [];
machine.Display = [.. machine.Display, displayItem];
break;
case DatItems.Formats.Driver driver:
var driverItem = driver.GetInternalClone();
EnsureMachineKey<Data.Models.Metadata.Driver?>(machine, Data.Models.Metadata.Machine.DriverKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.DriverKey, driverItem);
machine.Driver = driver.GetInternalClone();
break;
case DatItems.Formats.Feature feature:
var featureItem = feature.GetInternalClone();
EnsureMachineKey<Data.Models.Metadata.Feature?>(machine, Data.Models.Metadata.Machine.FeatureKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.FeatureKey, featureItem);
machine.Feature ??= [];
machine.Feature = [.. machine.Feature, featureItem];
break;
case DatItems.Formats.Info info:
var infoItem = info.GetInternalClone();
EnsureMachineKey<Data.Models.Metadata.Info?>(machine, Data.Models.Metadata.Machine.InfoKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.InfoKey, infoItem);
machine.Info ??= [];
machine.Info = [.. machine.Info, infoItem];
break;
case DatItems.Formats.Input input:
var inputItem = input.GetInternalClone();
EnsureMachineKey<Data.Models.Metadata.Input?>(machine, Data.Models.Metadata.Machine.InputKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.InputKey, inputItem);
machine.Input = input.GetInternalClone();
break;
case DatItems.Formats.Media media:
var mediaItem = media.GetInternalClone();
EnsureMachineKey<Data.Models.Metadata.Media?>(machine, Data.Models.Metadata.Machine.MediaKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.MediaKey, mediaItem);
machine.Media ??= [];
machine.Media = [.. machine.Media, mediaItem];
break;
case DatItems.Formats.PartFeature partFeature:
var partFeatureItem = partFeature.GetInternalClone();
EnsureMachineKey<Data.Models.Metadata.Feature?>(machine, Data.Models.Metadata.Machine.FeatureKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.FeatureKey, partFeatureItem);
machine.Feature ??= [];
machine.Feature = [.. machine.Feature, partFeatureItem];
// Add Part mapping
if (partFeature.Part is not null)
@@ -214,23 +210,23 @@ namespace SabreTools.Metadata.DatFiles
break;
case DatItems.Formats.Port port:
var portItem = port.GetInternalClone();
EnsureMachineKey<Data.Models.Metadata.Port?>(machine, Data.Models.Metadata.Machine.PortKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.PortKey, portItem);
machine.Port ??= [];
machine.Port = [.. machine.Port, portItem];
break;
case DatItems.Formats.RamOption ramOption:
var ramOptionItem = ramOption.GetInternalClone();
EnsureMachineKey<Data.Models.Metadata.RamOption?>(machine, Data.Models.Metadata.Machine.RamOptionKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.RamOptionKey, ramOptionItem);
machine.RamOption ??= [];
machine.RamOption = [.. machine.RamOption, ramOptionItem];
break;
case DatItems.Formats.Release release:
var releaseItem = release.GetInternalClone();
EnsureMachineKey<Data.Models.Metadata.Release?>(machine, Data.Models.Metadata.Machine.ReleaseKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.ReleaseKey, releaseItem);
machine.Release ??= [];
machine.Release = [.. machine.Release, releaseItem];
break;
case DatItems.Formats.Rom rom:
var romItem = ProcessItem(rom, machine);
EnsureMachineKey<Data.Models.Metadata.Rom?>(machine, Data.Models.Metadata.Machine.RomKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.RomKey, romItem);
machine.Rom ??= [];
machine.Rom = [.. machine.Rom, romItem];
// Add Part and DataArea mappings
if (rom.Part is not null && rom.DataArea is not null)
@@ -243,28 +239,26 @@ namespace SabreTools.Metadata.DatFiles
break;
case DatItems.Formats.Sample sample:
var sampleItem = sample.GetInternalClone();
EnsureMachineKey<Data.Models.Metadata.Sample?>(machine, Data.Models.Metadata.Machine.SampleKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.SampleKey, sampleItem);
machine.Sample ??= [];
machine.Sample = [.. machine.Sample, sampleItem];
break;
case DatItems.Formats.SharedFeat sharedFeat:
var sharedFeatItem = sharedFeat.GetInternalClone();
EnsureMachineKey<Data.Models.Metadata.SharedFeat?>(machine, Data.Models.Metadata.Machine.SharedFeatKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.SharedFeatKey, sharedFeatItem);
machine.SharedFeat ??= [];
machine.SharedFeat = [.. machine.SharedFeat, sharedFeatItem];
break;
case DatItems.Formats.Slot slot:
var slotItem = slot.GetInternalClone();
EnsureMachineKey<Data.Models.Metadata.Slot?>(machine, Data.Models.Metadata.Machine.SlotKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.SlotKey, slotItem);
machine.Slot ??= [];
machine.Slot = [.. machine.Slot, slotItem];
break;
case DatItems.Formats.SoftwareList softwareList:
var softwareListItem = softwareList.GetInternalClone();
EnsureMachineKey<Data.Models.Metadata.SoftwareList?>(machine, Data.Models.Metadata.Machine.SoftwareListKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.SoftwareListKey, softwareListItem);
machine.SoftwareList ??= [];
machine.SoftwareList = [.. machine.SoftwareList, softwareListItem];
break;
case DatItems.Formats.Sound sound:
var soundItem = sound.GetInternalClone();
EnsureMachineKey<Data.Models.Metadata.Sound?>(machine, Data.Models.Metadata.Machine.SoundKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.SoundKey, soundItem);
machine.Sound = sound.GetInternalClone();
break;
default:
// This should never happen
@@ -449,7 +443,7 @@ namespace SabreTools.Metadata.DatFiles
}
// Assign the part array to the machine
machine[Data.Models.Metadata.Machine.PartKey] = (Data.Models.Metadata.Part[])[.. partItems.Values];
machine.Part = [.. partItems.Values];
}
// Add the machine to the list
@@ -513,43 +507,43 @@ namespace SabreTools.Metadata.DatFiles
{
case DatItems.Formats.Adjuster adjuster:
var adjusterItem = adjuster.GetInternalClone();
EnsureMachineKey<Data.Models.Metadata.Adjuster?>(machine, Data.Models.Metadata.Machine.AdjusterKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.AdjusterKey, adjusterItem);
machine.Adjuster ??= [];
machine.Adjuster = [.. machine.Adjuster, adjusterItem];
break;
case DatItems.Formats.Archive archive:
var archiveItem = archive.GetInternalClone();
EnsureMachineKey<Data.Models.Metadata.Archive?>(machine, Data.Models.Metadata.Machine.ArchiveKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.ArchiveKey, archiveItem);
machine.Archive ??= [];
machine.Archive = [.. machine.Archive, archiveItem];
break;
case DatItems.Formats.BiosSet biosSet:
var biosSetItem = biosSet.GetInternalClone();
EnsureMachineKey<Data.Models.Metadata.BiosSet?>(machine, Data.Models.Metadata.Machine.BiosSetKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.BiosSetKey, biosSetItem);
machine.BiosSet ??= [];
machine.BiosSet = [.. machine.BiosSet, biosSetItem];
break;
case DatItems.Formats.Chip chip:
var chipItem = chip.GetInternalClone();
EnsureMachineKey<Data.Models.Metadata.Chip?>(machine, Data.Models.Metadata.Machine.ChipKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.ChipKey, chipItem);
machine.Chip ??= [];
machine.Chip = [.. machine.Chip, chipItem];
break;
case DatItems.Formats.Configuration configuration:
var configurationItem = configuration.GetInternalClone();
EnsureMachineKey<Data.Models.Metadata.Configuration?>(machine, Data.Models.Metadata.Machine.ConfigurationKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.ConfigurationKey, configurationItem);
machine.Configuration ??= [];
machine.Configuration = [.. machine.Configuration, configurationItem];
break;
case DatItems.Formats.Device device:
var deviceItem = device.GetInternalClone();
EnsureMachineKey<Data.Models.Metadata.Device?>(machine, Data.Models.Metadata.Machine.DeviceKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.DeviceKey, deviceItem);
machine.Device ??= [];
machine.Device = [.. machine.Device, deviceItem];
break;
case DatItems.Formats.DeviceRef deviceRef:
var deviceRefItem = deviceRef.GetInternalClone();
EnsureMachineKey<Data.Models.Metadata.DeviceRef?>(machine, Data.Models.Metadata.Machine.DeviceRefKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.DeviceRefKey, deviceRefItem);
machine.DeviceRef ??= [];
machine.DeviceRef = [.. machine.DeviceRef, deviceRefItem];
break;
case DatItems.Formats.DipSwitch dipSwitch:
var dipSwitchItem = dipSwitch.GetInternalClone();
EnsureMachineKey<Data.Models.Metadata.DipSwitch?>(machine, Data.Models.Metadata.Machine.DipSwitchKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.DipSwitchKey, dipSwitchItem);
machine.DipSwitch ??= [];
machine.DipSwitch = [.. machine.DipSwitch, dipSwitchItem];
// Add Part mapping
if (dipSwitch.Part is not null)
@@ -558,8 +552,8 @@ namespace SabreTools.Metadata.DatFiles
break;
case DatItems.Formats.Disk disk:
var diskItem = disk.GetInternalClone();
EnsureMachineKey<Data.Models.Metadata.Disk?>(machine, Data.Models.Metadata.Machine.DiskKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.DiskKey, diskItem);
machine.Disk ??= [];
machine.Disk = [.. machine.Disk, diskItem];
// Add Part and DiskArea mappings
if (disk.Part is not null && disk.DiskArea is not null)
@@ -572,38 +566,34 @@ namespace SabreTools.Metadata.DatFiles
break;
case DatItems.Formats.Display display:
var displayItem = ProcessItem(display, machine);
EnsureMachineKey<Data.Models.Metadata.Display?>(machine, Data.Models.Metadata.Machine.DisplayKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.DisplayKey, displayItem);
machine.Display ??= [];
machine.Display = [.. machine.Display, displayItem];
break;
case DatItems.Formats.Driver driver:
var driverItem = driver.GetInternalClone();
EnsureMachineKey<Data.Models.Metadata.Driver?>(machine, Data.Models.Metadata.Machine.DriverKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.DriverKey, driverItem);
machine.Driver = driver.GetInternalClone();
break;
case DatItems.Formats.Feature feature:
var featureItem = feature.GetInternalClone();
EnsureMachineKey<Data.Models.Metadata.Feature?>(machine, Data.Models.Metadata.Machine.FeatureKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.FeatureKey, featureItem);
machine.Feature ??= [];
machine.Feature = [.. machine.Feature, featureItem];
break;
case DatItems.Formats.Info info:
var infoItem = info.GetInternalClone();
EnsureMachineKey<Data.Models.Metadata.Info?>(machine, Data.Models.Metadata.Machine.InfoKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.InfoKey, infoItem);
machine.Info ??= [];
machine.Info = [.. machine.Info, infoItem];
break;
case DatItems.Formats.Input input:
var inputItem = input.GetInternalClone();
EnsureMachineKey<Data.Models.Metadata.Input?>(machine, Data.Models.Metadata.Machine.InputKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.InputKey, inputItem);
machine.Input = input.GetInternalClone();
break;
case DatItems.Formats.Media media:
var mediaItem = media.GetInternalClone();
EnsureMachineKey<Data.Models.Metadata.Media?>(machine, Data.Models.Metadata.Machine.MediaKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.MediaKey, mediaItem);
machine.Media ??= [];
machine.Media = [.. machine.Media, mediaItem];
break;
case DatItems.Formats.PartFeature partFeature:
var partFeatureItem = partFeature.GetInternalClone();
EnsureMachineKey<Data.Models.Metadata.Feature?>(machine, Data.Models.Metadata.Machine.FeatureKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.FeatureKey, partFeatureItem);
machine.Feature ??= [];
machine.Feature = [.. machine.Feature, partFeatureItem];
// Add Part mapping
if (partFeature.Part is not null)
@@ -612,23 +602,23 @@ namespace SabreTools.Metadata.DatFiles
break;
case DatItems.Formats.Port port:
var portItem = port.GetInternalClone();
EnsureMachineKey<Data.Models.Metadata.Port?>(machine, Data.Models.Metadata.Machine.PortKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.PortKey, portItem);
machine.Port ??= [];
machine.Port = [.. machine.Port, portItem];
break;
case DatItems.Formats.RamOption ramOption:
var ramOptionItem = ramOption.GetInternalClone();
EnsureMachineKey<Data.Models.Metadata.RamOption?>(machine, Data.Models.Metadata.Machine.RamOptionKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.RamOptionKey, ramOptionItem);
machine.RamOption ??= [];
machine.RamOption = [.. machine.RamOption, ramOptionItem];
break;
case DatItems.Formats.Release release:
var releaseItem = release.GetInternalClone();
EnsureMachineKey<Data.Models.Metadata.Release?>(machine, Data.Models.Metadata.Machine.ReleaseKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.ReleaseKey, releaseItem);
machine.Release ??= [];
machine.Release = [.. machine.Release, releaseItem];
break;
case DatItems.Formats.Rom rom:
var romItem = ProcessItem(rom, machine);
EnsureMachineKey<Data.Models.Metadata.Rom?>(machine, Data.Models.Metadata.Machine.RomKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.RomKey, romItem);
machine.Rom ??= [];
machine.Rom = [.. machine.Rom, romItem];
// Add Part and DataArea mappings
if (rom.Part is not null && rom.DataArea is not null)
@@ -641,28 +631,26 @@ namespace SabreTools.Metadata.DatFiles
break;
case DatItems.Formats.Sample sample:
var sampleItem = sample.GetInternalClone();
EnsureMachineKey<Data.Models.Metadata.Sample?>(machine, Data.Models.Metadata.Machine.SampleKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.SampleKey, sampleItem);
machine.Sample ??= [];
machine.Sample = [.. machine.Sample, sampleItem];
break;
case DatItems.Formats.SharedFeat sharedFeat:
var sharedFeatItem = sharedFeat.GetInternalClone();
EnsureMachineKey<Data.Models.Metadata.SharedFeat?>(machine, Data.Models.Metadata.Machine.SharedFeatKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.SharedFeatKey, sharedFeatItem);
machine.SharedFeat ??= [];
machine.SharedFeat = [.. machine.SharedFeat, sharedFeatItem];
break;
case DatItems.Formats.Slot slot:
var slotItem = slot.GetInternalClone();
EnsureMachineKey<Data.Models.Metadata.Slot?>(machine, Data.Models.Metadata.Machine.SlotKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.SlotKey, slotItem);
machine.Slot ??= [];
machine.Slot = [.. machine.Slot, slotItem];
break;
case DatItems.Formats.SoftwareList softwareList:
var softwareListItem = softwareList.GetInternalClone();
EnsureMachineKey<Data.Models.Metadata.SoftwareList?>(machine, Data.Models.Metadata.Machine.SoftwareListKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.SoftwareListKey, softwareListItem);
machine.SoftwareList ??= [];
machine.SoftwareList = [.. machine.SoftwareList, softwareListItem];
break;
case DatItems.Formats.Sound sound:
var soundItem = sound.GetInternalClone();
EnsureMachineKey<Data.Models.Metadata.Sound?>(machine, Data.Models.Metadata.Machine.SoundKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.SoundKey, soundItem);
machine.Sound = sound.GetInternalClone();
break;
default:
// This should never happen
@@ -847,7 +835,7 @@ namespace SabreTools.Metadata.DatFiles
}
// Assign the part array to the machine
machine[Data.Models.Metadata.Machine.PartKey] = (Data.Models.Metadata.Part[])[.. partItems.Values];
machine.Part = [.. partItems.Values];
}
// Add the machine to the list
@@ -885,8 +873,8 @@ namespace SabreTools.Metadata.DatFiles
Width = displayItem.Width,
};
EnsureMachineKey<Data.Models.Metadata.Video?>(machine, Data.Models.Metadata.Machine.VideoKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.VideoKey, videoItem);
machine.Video ??= [];
machine.Video = [.. machine.Video, videoItem];
}
return displayItem;
@@ -932,8 +920,8 @@ namespace SabreTools.Metadata.DatFiles
dumpRom[Data.Models.Metadata.Dump.OriginalKey] = newOriginal;
}
EnsureMachineKey<Data.Models.Metadata.Dump?>(machine, Data.Models.Metadata.Machine.DumpKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.DumpKey, dumpRom);
machine.Dump ??= [];
machine.Dump = [.. machine.Dump, dumpRom];
break;
case OpenMSXSubType.MegaRom:
@@ -960,8 +948,8 @@ namespace SabreTools.Metadata.DatFiles
dumpMegaRom[Data.Models.Metadata.Dump.OriginalKey] = newOriginal;
}
EnsureMachineKey<Data.Models.Metadata.Dump?>(machine, Data.Models.Metadata.Machine.DumpKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.DumpKey, dumpMegaRom);
machine.Dump ??= [];
machine.Dump = [.. machine.Dump, dumpMegaRom];
break;
case OpenMSXSubType.SCCPlusCart:
@@ -988,8 +976,8 @@ namespace SabreTools.Metadata.DatFiles
dumpSccPlusCart[Data.Models.Metadata.Dump.OriginalKey] = newOriginal;
}
EnsureMachineKey<Data.Models.Metadata.Dump?>(machine, Data.Models.Metadata.Machine.DumpKey);
AppendToMachineKey(machine, Data.Models.Metadata.Machine.DumpKey, dumpSccPlusCart);
machine.Dump ??= [];
machine.Dump = [.. machine.Dump, dumpSccPlusCart];
break;
default:
// This should never happen
@@ -999,38 +987,6 @@ namespace SabreTools.Metadata.DatFiles
return romItem;
}
/// <summary>
/// Ensure a key in a machine
/// </summary>
private static void EnsureMachineKey<T>(Data.Models.Metadata.Machine machine, string key)
{
if (machine.Read<T[]?>(key) is null)
#if NET20 || NET35 || NET40 || NET452
machine[key] = new T[0];
#else
machine[key] = System.Array.Empty<T>();
#endif
}
/// <summary>
/// Append to a machine key as if its an array
/// </summary>
private static void AppendToMachineKey<T>(Data.Models.Metadata.Machine machine, string key, T value) where T : Data.Models.Metadata.DatItem
{
// Get the existing array
var arr = machine.Read<T[]>(key);
if (arr is null)
return;
// Trim all null fields
ClearEmptyKeys(value);
// Add to the array
List<T> list = [.. arr];
list.Add(value);
machine[key] = list.ToArray();
}
/// <summary>
/// Clear empty keys from a DictionaryBase object
/// </summary>