diff --git a/SabreTools.Data.Extensions.Test/MetadataExtensionsTests.cs b/SabreTools.Data.Extensions.Test/MetadataExtensionsTests.cs
index e7d0fe01..bc7a5ce5 100644
--- a/SabreTools.Data.Extensions.Test/MetadataExtensionsTests.cs
+++ b/SabreTools.Data.Extensions.Test/MetadataExtensionsTests.cs
@@ -2515,7 +2515,7 @@ namespace SabreTools.Data.Extensions.Test
var other = new Disk();
self.FillMissingHashes(other);
- Assert.Empty(self);
+ Assert.False(self.HasHashes());
}
[Fact]
@@ -2537,7 +2537,7 @@ namespace SabreTools.Data.Extensions.Test
var self = new Media();
var other = new Media();
self.FillMissingHashes(other);
- Assert.Empty(self);
+ Assert.False(self.HasHashes());
}
[Fact]
@@ -2561,7 +2561,7 @@ namespace SabreTools.Data.Extensions.Test
var self = new Rom();
var other = new Rom();
self.FillMissingHashes(other);
- Assert.Empty(self);
+ Assert.False(self.HasHashes());
}
[Fact]
diff --git a/SabreTools.Data.Models/Metadata/DatItem.cs b/SabreTools.Data.Models/Metadata/DatItem.cs
index 85f6a0fb..13dd2bbb 100644
--- a/SabreTools.Data.Models/Metadata/DatItem.cs
+++ b/SabreTools.Data.Models/Metadata/DatItem.cs
@@ -6,7 +6,7 @@ namespace SabreTools.Data.Models.Metadata
///
/// Format-agnostic representation of item data
///
- public class DatItem : DictionaryBase
+ public class DatItem
{
///
/// Quick accessor to item type, if it exists
diff --git a/SabreTools.Data.Models/Metadata/DictionaryBase.cs b/SabreTools.Data.Models/Metadata/DictionaryBase.cs
deleted file mode 100644
index 9aec47bd..00000000
--- a/SabreTools.Data.Models/Metadata/DictionaryBase.cs
+++ /dev/null
@@ -1,263 +0,0 @@
-using System.Collections.Generic;
-
-namespace SabreTools.Data.Models.Metadata
-{
- ///
- /// Specialized dictionary base for item types
- ///
- public abstract class DictionaryBase : Dictionary
- {
- #region Read
-
- ///
- /// Read a key as the specified type, returning null on error
- ///
- public T? Read(string key)
- {
- try
- {
- if (!ValidateReadKey(key))
- return default;
- if (this[key] is not T)
- return default;
- return (T?)this[key];
- }
- catch
- {
- return default;
- }
- }
-
- ///
- /// Read a key as a bool, returning null on error
- ///
- /// TODO: Determine if this can be removed
- public bool? ReadBool(string key)
- {
- if (!ValidateReadKey(key))
- return null;
-
- bool? asBool = Read(key);
- if (asBool is not null)
- return asBool;
-
- string? asString = Read(key);
- return asString?.ToLowerInvariant() switch
- {
- "true" or "yes" => true,
- "false" or "no" => false,
- _ => null,
- };
- }
-
- ///
- /// Read a key as a double, returning null on error
- ///
- /// TODO: Determine if this can be removed
- public double? ReadDouble(string key)
- {
- if (!ValidateReadKey(key))
- return null;
-
- double? asDouble = Read(key);
- if (asDouble is not null)
- return asDouble;
-
- float? asFloat = Read(key);
- if (asFloat is not null)
- return asFloat;
-
-#if NET5_0_OR_GREATER
- System.Half? asHalf = Read(key);
- if (asHalf is not null)
- return (double?)asHalf;
-#endif
-
- string? asString = Read(key);
- if (asString is not null && double.TryParse(asString, out double asStringDouble))
- return asStringDouble;
-
- return null;
- }
-
- ///
- /// Read a key as a long, returning null on error
- ///
- /// TODO: Add logic to convert SI suffixes and hex
- /// TODO: Determine if this can be removed
- public long? ReadLong(string key)
- {
- if (!ValidateReadKey(key))
- return null;
-
- long? asLong = Read(key);
- if (asLong is not null)
- return asLong;
-
- int? asInt = Read(key);
- if (asInt is not null)
- return asInt;
-
- short? asShort = Read(key);
- if (asShort is not null)
- return asShort;
-
- string? asString = Read(key);
- if (asString is not null && long.TryParse(asString, out long asStringLong))
- return asStringLong;
-
- return null;
- }
-
- ///
- /// Read a key as a string, returning null on error
- ///
- public string? ReadString(string key)
- {
- if (!ValidateReadKey(key))
- return null;
-
- string? asString = Read(key);
- if (asString is not null)
- return asString;
-
- string[]? asArray = Read(key);
- if (asArray is not null)
-#if NETFRAMEWORK || NETSTANDARD2_0
- return string.Join(",", asArray);
-#else
- return string.Join(',', asArray);
-#endif
-
- // TODO: Add byte array conversion here
- // TODO: Add byte array read helper
-
- return this[key]!.ToString();
- }
-
- ///
- /// Read a key as a T[], returning null on error
- ///
- public T[]? ReadArray(string key)
- {
- if (!ValidateReadKey(key))
- return null;
-
- var items = Read(key);
- if (items is not null)
- return items;
-
- var single = Read(key);
- if (single is not null)
- return [single];
-
- return null;
- }
-
- ///
- /// Read a key as a string[], returning null on error
- ///
- /// TODO: Determine if this can be removed
- public string[]? ReadStringArray(string key)
- {
- if (!ValidateReadKey(key))
- return null;
-
- string[]? asArray = Read(key);
- if (asArray is not null)
- return asArray;
-
- string? asString = Read(key);
- if (asString is not null)
- return [asString];
-
- asString = this[key]!.ToString();
- if (asString is not null)
- return [asString];
-
- return null;
- }
-
- ///
- /// Check if a key is valid for read
- ///
- private bool ValidateReadKey(string key)
- {
- if (string.IsNullOrEmpty(key))
- return false;
- else if (!ContainsKey(key))
- return false;
- else if (this[key] is null)
- return false;
-
- return true;
- }
-
- #endregion
-
- #region Write
-
- ///
- /// Remove a key, if possible
- ///
- public new bool Remove(string? fieldName)
- {
- // If the item or field name are missing, we can't do anything
- if (string.IsNullOrEmpty(fieldName))
- return false;
-
- // If the key doesn't exist, then it's already removed
- if (!ContainsKey(fieldName!))
- return true;
-
- // Remove the key
- base.Remove(fieldName!);
- return true;
- }
-
- ///
- /// Replace a field from another item
- ///
- public bool Replace(DictionaryBase? from, string fieldName)
- {
- // If the source item is invalid
- if (from is null)
- return false;
-
- // If the field name is missing, we can't do anything
- if (string.IsNullOrEmpty(fieldName))
- return false;
-
- // If the types of the items are not the same, we can't do anything
- if (from.GetType() != GetType())
- return false;
-
- // If the key doesn't exist in the source, we can't do anything
- if (!from.TryGetValue(fieldName!, out var value))
- return false;
-
- // Set the key
- this[fieldName!] = value;
- return true;
- }
-
- ///
- /// Write a key as the specified type, returning false on error
- ///
- /// Field to set
- /// Value to set
- /// True if the value was set, false otherwise
- public bool Write(string fieldName, T? value)
- {
- // Invalid field cannot be processed
- if (fieldName is null)
- return false;
-
- // Set the value based on the type
- this[fieldName] = value;
- return true;
- }
-
- #endregion
- }
-}
diff --git a/SabreTools.Data.Models/Metadata/Header.cs b/SabreTools.Data.Models/Metadata/Header.cs
index 1d8f30cb..eca5505d 100644
--- a/SabreTools.Data.Models/Metadata/Header.cs
+++ b/SabreTools.Data.Models/Metadata/Header.cs
@@ -6,7 +6,7 @@ namespace SabreTools.Data.Models.Metadata
///
/// Format-agnostic representation of metadata header data
///
- public class Header : DictionaryBase, ICloneable, IEquatable
+ public class Header : ICloneable, IEquatable
{
#region Properties
@@ -37,6 +37,8 @@ namespace SabreTools.Data.Models.Metadata
public string? EmulatorVersion { get; set; }
+ public string? FileName { get; set; }
+
/// (none|split|merged|nonmerged|fullmerged|device|full) "split"
public MergingFlag ForceMerging { get; set; }
@@ -135,6 +137,7 @@ namespace SabreTools.Data.Models.Metadata
obj.Description = Description;
obj.Email = Email;
obj.EmulatorVersion = EmulatorVersion;
+ obj.FileName = FileName;
obj.ForceMerging = ForceMerging;
obj.ForceNodump = ForceNodump;
obj.ForcePacking = ForcePacking;
@@ -231,6 +234,11 @@ namespace SabreTools.Data.Models.Metadata
else if (EmulatorVersion is not null && !EmulatorVersion.Equals(other.EmulatorVersion, StringComparison.OrdinalIgnoreCase))
return false;
+ if ((FileName is null) ^ (other.FileName is null))
+ return false;
+ else if (FileName is not null && !FileName.Equals(other.FileName, StringComparison.OrdinalIgnoreCase))
+ return false;
+
if (ForceMerging != other.ForceMerging)
return false;
diff --git a/SabreTools.Data.Models/Metadata/InfoSource.cs b/SabreTools.Data.Models/Metadata/InfoSource.cs
index 0caa79bd..909fde2d 100644
--- a/SabreTools.Data.Models/Metadata/InfoSource.cs
+++ b/SabreTools.Data.Models/Metadata/InfoSource.cs
@@ -4,13 +4,8 @@ using Newtonsoft.Json;
namespace SabreTools.Data.Models.Metadata
{
[JsonObject("infosource"), XmlRoot("infosource")]
- public class InfoSource : DictionaryBase
+ public class InfoSource
{
- #region Keys
-
- /// string[]
- public const string SourceKey = "source";
-
- #endregion
+ public string[]? Source { get; set; }
}
}
diff --git a/SabreTools.Data.Models/Metadata/Machine.cs b/SabreTools.Data.Models/Metadata/Machine.cs
index 2563a549..7ca9bde4 100644
--- a/SabreTools.Data.Models/Metadata/Machine.cs
+++ b/SabreTools.Data.Models/Metadata/Machine.cs
@@ -5,7 +5,7 @@ namespace SabreTools.Data.Models.Metadata
///
/// Format-agnostic representation of game, machine, and set data
///
- public class Machine : DictionaryBase, ICloneable, IEquatable
+ public class Machine : ICloneable, IEquatable
{
#region Properties
diff --git a/SabreTools.Data.Models/Metadata/MetadataFile.cs b/SabreTools.Data.Models/Metadata/MetadataFile.cs
index efbfbd1c..1b23fb8e 100644
--- a/SabreTools.Data.Models/Metadata/MetadataFile.cs
+++ b/SabreTools.Data.Models/Metadata/MetadataFile.cs
@@ -6,7 +6,7 @@ namespace SabreTools.Data.Models.Metadata
///
/// TODO: ICloneable
/// TODO: IComparable
- public class MetadataFile : DictionaryBase
+ public class MetadataFile
{
public Header? Header { get; set; }
diff --git a/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs b/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs
index bf5feeff..287dec21 100644
--- a/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs
+++ b/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs
@@ -25,7 +25,7 @@ namespace SabreTools.Metadata.DatFiles.Test
[Fact]
public void ConvertFromMetadata_Empty()
{
- Data.Models.Metadata.MetadataFile? item = [];
+ Data.Models.Metadata.MetadataFile? item = new Data.Models.Metadata.MetadataFile();
DatFile datFile = new Formats.Logiqx(null, useGame: false);
datFile.ConvertFromMetadata(item, "filename", indexId: 0, keep: true, statsOnly: false, filterRunner: null);
@@ -211,6 +211,7 @@ namespace SabreTools.Metadata.DatFiles.Test
Description = "description",
Email = "email",
EmulatorVersion = "emulatorversion",
+ FileName = "filename",
ForceMerging = Data.Models.Metadata.MergingFlag.Merged,
ForceNodump = Data.Models.Metadata.NodumpFlag.Required,
ForcePacking = Data.Models.Metadata.PackingFlag.Zip,
@@ -549,7 +550,7 @@ namespace SabreTools.Metadata.DatFiles.Test
{
Endianness = Data.Models.Metadata.Endianness.Big,
Name = "name",
- Rom = [[]],
+ Rom = [new Data.Models.Metadata.Rom()],
Size = 12345,
Width = Data.Models.Metadata.Width.Long,
};
@@ -575,7 +576,7 @@ namespace SabreTools.Metadata.DatFiles.Test
{
return new Data.Models.Metadata.DiskArea
{
- Disk = [[]],
+ Disk = [new Data.Models.Metadata.Disk()],
Name = "name",
};
}
@@ -716,7 +717,7 @@ namespace SabreTools.Metadata.DatFiles.Test
{
DataArea = [CreateMetadataDataArea()],
DiskArea = [CreateMetadataDiskArea()],
- DipSwitch = [[]],
+ DipSwitch = [new Data.Models.Metadata.DipSwitch()],
Feature = [CreateMetadataFeature()],
Interface = "interface",
Name = "name",
diff --git a/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs b/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs
index 305af4d3..bae88c63 100644
--- a/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs
+++ b/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs
@@ -360,6 +360,7 @@ namespace SabreTools.Metadata.DatFiles.Test
Assert.Equal("description", header.Description);
Assert.Equal("email", header.Email);
Assert.Equal("emulatorversion", header.EmulatorVersion);
+ Assert.Equal("filename", header.FileName);
Assert.Equal(Data.Models.Metadata.MergingFlag.Merged, header.ForceMerging);
Assert.Equal(Data.Models.Metadata.NodumpFlag.Required, header.ForceNodump);
Assert.Equal(Data.Models.Metadata.PackingFlag.Zip, header.ForcePacking);
diff --git a/SabreTools.Metadata.DatFiles/DatFile.FromMetadata.cs b/SabreTools.Metadata.DatFiles/DatFile.FromMetadata.cs
index 1727a456..f2e8890d 100644
--- a/SabreTools.Metadata.DatFiles/DatFile.FromMetadata.cs
+++ b/SabreTools.Metadata.DatFiles/DatFile.FromMetadata.cs
@@ -239,7 +239,7 @@ namespace SabreTools.Metadata.DatFiles
// Convert items in the machine
if (item.Adjuster is not null)
{
- var items = item.Adjuster ?? [];
+ var items = item.Adjuster;
var filtered = filterRunner is null ? items : Array.FindAll(items, i => filterRunner.Run(item));
Array.ForEach(filtered, item =>
{
@@ -251,7 +251,7 @@ namespace SabreTools.Metadata.DatFiles
if (item.Archive is not null)
{
- var items = item.Archive ?? [];
+ var items = item.Archive;
var filtered = filterRunner is null ? items : Array.FindAll(items, i => filterRunner.Run(item));
Array.ForEach(filtered, item =>
{
@@ -263,7 +263,7 @@ namespace SabreTools.Metadata.DatFiles
if (item.BiosSet is not null)
{
- var items = item.BiosSet ?? [];
+ var items = item.BiosSet;
var filtered = filterRunner is null ? items : Array.FindAll(items, i => filterRunner.Run(item));
Array.ForEach(filtered, item =>
{
@@ -275,7 +275,7 @@ namespace SabreTools.Metadata.DatFiles
if (item.Chip is not null)
{
- var items = item.Chip ?? [];
+ var items = item.Chip;
var filtered = filterRunner is null ? items : Array.FindAll(items, i => filterRunner.Run(item));
Array.ForEach(filtered, item =>
{
@@ -287,7 +287,7 @@ namespace SabreTools.Metadata.DatFiles
if (item.Configuration is not null)
{
- var items = item.Configuration ?? [];
+ var items = item.Configuration;
var filtered = filterRunner is null ? items : Array.FindAll(items, i => filterRunner.Run(item));
Array.ForEach(filtered, item =>
{
@@ -299,7 +299,7 @@ namespace SabreTools.Metadata.DatFiles
if (item.Device is not null)
{
- var items = item.Device ?? [];
+ var items = item.Device;
var filtered = filterRunner is null ? items : Array.FindAll(items, i => filterRunner.Run(item));
Array.ForEach(filtered, item =>
{
@@ -311,7 +311,7 @@ namespace SabreTools.Metadata.DatFiles
if (item.DeviceRef is not null)
{
- var items = item.DeviceRef ?? [];
+ var items = item.DeviceRef;
// Do not filter these due to later use
Array.ForEach(items, item =>
{
@@ -323,7 +323,7 @@ namespace SabreTools.Metadata.DatFiles
if (item.DipSwitch is not null)
{
- var items = item.DipSwitch ?? [];
+ var items = item.DipSwitch;
var filtered = filterRunner is null ? items : Array.FindAll(items, i => filterRunner.Run(item));
Array.ForEach(filtered, item =>
{
@@ -335,7 +335,7 @@ namespace SabreTools.Metadata.DatFiles
if (item.Disk is not null)
{
- var items = item.Disk ?? [];
+ var items = item.Disk;
var filtered = filterRunner is null ? items : Array.FindAll(items, i => filterRunner.Run(item));
Array.ForEach(filtered, item =>
{
@@ -347,7 +347,7 @@ namespace SabreTools.Metadata.DatFiles
if (item.Display is not null)
{
- var items = item.Display ?? [];
+ var items = item.Display;
var filtered = filterRunner is null ? items : Array.FindAll(items, i => filterRunner.Run(item));
Array.ForEach(filtered, item =>
{
@@ -366,7 +366,7 @@ namespace SabreTools.Metadata.DatFiles
if (item.Dump is not null)
{
- var items = item.Dump ?? [];
+ var items = item.Dump;
for (int i = 0; i < items.Length; i++)
{
var datItem = new Rom(items[i], machine, source, i);
@@ -391,7 +391,7 @@ namespace SabreTools.Metadata.DatFiles
if (item.Feature is not null)
{
- var items = item.Feature ?? [];
+ var items = item.Feature;
var filtered = filterRunner is null ? items : Array.FindAll(items, i => filterRunner.Run(item));
Array.ForEach(filtered, item =>
{
@@ -403,7 +403,7 @@ namespace SabreTools.Metadata.DatFiles
if (item.Info is not null)
{
- var items = item.Info ?? [];
+ var items = item.Info;
var filtered = filterRunner is null ? items : Array.FindAll(items, i => filterRunner.Run(item));
Array.ForEach(filtered, item =>
{
@@ -422,7 +422,7 @@ namespace SabreTools.Metadata.DatFiles
if (item.Media is not null)
{
- var items = item.Media ?? [];
+ var items = item.Media;
var filtered = filterRunner is null ? items : Array.FindAll(items, i => filterRunner.Run(item));
Array.ForEach(filtered, item =>
{
@@ -434,13 +434,13 @@ namespace SabreTools.Metadata.DatFiles
if (item.Part is not null)
{
- var items = item.Part ?? [];
+ var items = item.Part;
ProcessItems(items, machine, machineIndex: 0, source, sourceIndex, statsOnly, filterRunner);
}
if (item.Port is not null)
{
- var items = item.Port ?? [];
+ var items = item.Port;
var filtered = filterRunner is null ? items : Array.FindAll(items, i => filterRunner.Run(item));
Array.ForEach(filtered, item =>
{
@@ -452,7 +452,7 @@ namespace SabreTools.Metadata.DatFiles
if (item.RamOption is not null)
{
- var items = item.RamOption ?? [];
+ var items = item.RamOption;
var filtered = filterRunner is null ? items : Array.FindAll(items, i => filterRunner.Run(item));
Array.ForEach(filtered, item =>
{
@@ -464,7 +464,7 @@ namespace SabreTools.Metadata.DatFiles
if (item.Release is not null)
{
- var items = item.Release ?? [];
+ var items = item.Release;
var filtered = filterRunner is null ? items : Array.FindAll(items, i => filterRunner.Run(item));
Array.ForEach(filtered, item =>
{
@@ -476,7 +476,7 @@ namespace SabreTools.Metadata.DatFiles
if (item.Rom is not null)
{
- var items = item.Rom ?? [];
+ var items = item.Rom;
var filtered = filterRunner is null ? items : Array.FindAll(items, i => filterRunner.Run(item));
Array.ForEach(filtered, item =>
{
@@ -491,7 +491,7 @@ namespace SabreTools.Metadata.DatFiles
if (item.Sample is not null)
{
- var items = item.Sample ?? [];
+ var items = item.Sample;
var filtered = filterRunner is null ? items : Array.FindAll(items, i => filterRunner.Run(item));
Array.ForEach(filtered, item =>
{
@@ -503,7 +503,7 @@ namespace SabreTools.Metadata.DatFiles
if (item.SharedFeat is not null)
{
- var items = item.SharedFeat ?? [];
+ var items = item.SharedFeat;
var filtered = filterRunner is null ? items : Array.FindAll(items, i => filterRunner.Run(item));
Array.ForEach(filtered, item =>
{
@@ -515,7 +515,7 @@ namespace SabreTools.Metadata.DatFiles
if (item.Slot is not null)
{
- var items = item.Slot ?? [];
+ var items = item.Slot;
// Do not filter these due to later use
Array.ForEach(items, item =>
{
@@ -527,7 +527,7 @@ namespace SabreTools.Metadata.DatFiles
if (item.SoftwareList is not null)
{
- var items = item.SoftwareList ?? [];
+ var items = item.SoftwareList;
var filtered = filterRunner is null ? items : Array.FindAll(items, i => filterRunner.Run(item));
Array.ForEach(filtered, item =>
{
@@ -546,7 +546,7 @@ namespace SabreTools.Metadata.DatFiles
if (item.Video is not null)
{
- var items = item.Video ?? [];
+ var items = item.Video;
var filtered = filterRunner is null ? items : Array.FindAll(items, i => filterRunner.Run(item));
Array.ForEach(filtered, item =>
{
diff --git a/SabreTools.Metadata.DatFiles/DatFile.ToMetadata.cs b/SabreTools.Metadata.DatFiles/DatFile.ToMetadata.cs
index 4f1be21e..a18df700 100644
--- a/SabreTools.Metadata.DatFiles/DatFile.ToMetadata.cs
+++ b/SabreTools.Metadata.DatFiles/DatFile.ToMetadata.cs
@@ -270,25 +270,19 @@ namespace SabreTools.Metadata.DatFiles
// Create the part in the dictionary, if needed
if (!partItems.ContainsKey(partName))
- partItems[partName] = [];
+ partItems[partName] = new();
// Copy over string values
partItems[partName].Name = partName;
if (partItems[partName].Interface == null)
partItems[partName].Interface = partItem.Interface;
- // Clear any empty fields
- ClearEmptyKeys(partItems[partName]);
-
// If the item has a DataArea mapping
if (dataAreaMappings.TryGetValue(partItem, out (Data.Models.Metadata.DataArea, Data.Models.Metadata.Rom) dataAreaMap))
{
// Get the mapped items
var (dataArea, romItem) = dataAreaMap;
- // Clear any empty fields
- ClearEmptyKeys(romItem);
-
// Get the data area name and skip if there's none
string? dataAreaName = dataArea.Name;
if (dataAreaName is not null)
@@ -306,16 +300,15 @@ namespace SabreTools.Metadata.DatFiles
}
else
{
- aggregateDataArea = [];
- aggregateDataArea.Endianness = dataArea.Endianness;
- aggregateDataArea.Name = dataArea.Name;
- aggregateDataArea.Size = dataArea.Size;
- aggregateDataArea.Width = dataArea.Width;
+ aggregateDataArea = new()
+ {
+ Endianness = dataArea.Endianness,
+ Name = dataArea.Name,
+ Size = dataArea.Size,
+ Width = dataArea.Width,
+ };
}
- // Clear any empty fields
- ClearEmptyKeys(aggregateDataArea);
-
// Get existing roms as a list
var romsArr = aggregateDataArea.Rom ?? [];
List roms = [.. romsArr];
@@ -343,9 +336,6 @@ namespace SabreTools.Metadata.DatFiles
// Get the mapped items
var (diskArea, diskItem) = diskAreaMap;
- // Clear any empty fields
- ClearEmptyKeys(diskItem);
-
// Get the disk area name and skip if there's none
string? diskAreaName = diskArea.Name;
if (diskAreaName is not null)
@@ -363,13 +353,10 @@ namespace SabreTools.Metadata.DatFiles
}
else
{
- aggregateDiskArea = [];
+ aggregateDiskArea = new();
aggregateDiskArea.Name = diskArea.Name;
}
- // Clear any empty fields
- ClearEmptyKeys(aggregateDiskArea);
-
// Get existing disks as a list
var disksArr = aggregateDiskArea.Disk ?? [];
List disks = [.. disksArr];
@@ -398,9 +385,6 @@ namespace SabreTools.Metadata.DatFiles
var dipSwitchesArr = partItems[partName].DipSwitch ?? [];
List dipSwitches = [.. dipSwitchesArr];
- // Clear any empty fields
- ClearEmptyKeys(dipSwitchItem);
-
// Add the dipswitch
dipSwitches.Add(dipSwitchItem);
@@ -415,9 +399,6 @@ namespace SabreTools.Metadata.DatFiles
var featuresArr = partItems[partName].Feature ?? [];
List features = [.. featuresArr];
- // Clear any empty fields
- ClearEmptyKeys(featureItem);
-
// Add the feature
features.Add(featureItem);
@@ -646,25 +627,19 @@ namespace SabreTools.Metadata.DatFiles
// Create the part in the dictionary, if needed
if (!partItems.ContainsKey(partName))
- partItems[partName] = [];
+ partItems[partName] = new();
// Copy over string values
partItems[partName].Name = partName;
if (partItems[partName].Interface == null)
partItems[partName].Interface = partItem.Interface;
- // Clear any empty fields
- ClearEmptyKeys(partItems[partName]);
-
// If the item has a DataArea mapping
if (dataAreaMappings.TryGetValue(partItem, out (Data.Models.Metadata.DataArea, Data.Models.Metadata.Rom) dataAreaMap))
{
// Get the mapped items
var (dataArea, romItem) = dataAreaMap;
- // Clear any empty fields
- ClearEmptyKeys(romItem);
-
// Get the data area name and skip if there's none
string? dataAreaName = dataArea.Name;
if (dataAreaName is not null)
@@ -682,16 +657,13 @@ namespace SabreTools.Metadata.DatFiles
}
else
{
- aggregateDataArea = [];
+ aggregateDataArea = new();
aggregateDataArea.Endianness = dataArea.Endianness;
aggregateDataArea.Name = dataArea.Name;
aggregateDataArea.Size = dataArea.Size;
aggregateDataArea.Width = dataArea.Width;
}
- // Clear any empty fields
- ClearEmptyKeys(aggregateDataArea);
-
// Get existing roms as a list
var romsArr = aggregateDataArea.Rom ?? [];
List roms = [.. romsArr];
@@ -719,9 +691,6 @@ namespace SabreTools.Metadata.DatFiles
// Get the mapped items
var (diskArea, diskItem) = diskAreaMap;
- // Clear any empty fields
- ClearEmptyKeys(diskItem);
-
// Get the disk area name and skip if there's none
string? diskAreaName = diskArea.Name;
if (diskAreaName is not null)
@@ -739,13 +708,10 @@ namespace SabreTools.Metadata.DatFiles
}
else
{
- aggregateDiskArea = [];
+ aggregateDiskArea = new();
aggregateDiskArea.Name = diskArea.Name;
}
- // Clear any empty fields
- ClearEmptyKeys(aggregateDiskArea);
-
// Get existing disks as a list
var disksArr = aggregateDiskArea.Disk ?? [];
List disks = [.. disksArr];
@@ -774,9 +740,6 @@ namespace SabreTools.Metadata.DatFiles
var dipSwitchesArr = partItems[partName].DipSwitch ?? [];
List dipSwitches = [.. dipSwitchesArr];
- // Clear any empty fields
- ClearEmptyKeys(dipSwitchItem);
-
// Add the dipswitch
dipSwitches.Add(dipSwitchItem);
@@ -791,9 +754,6 @@ namespace SabreTools.Metadata.DatFiles
var featuresArr = partItems[partName].Feature ?? [];
List features = [.. featuresArr];
- // Clear any empty fields
- ClearEmptyKeys(featureItem);
-
// Add the feature
features.Add(featureItem);
@@ -953,19 +913,6 @@ namespace SabreTools.Metadata.DatFiles
return romItem;
}
- ///
- /// Clear empty keys from a DictionaryBase object
- ///
- private static void ClearEmptyKeys(Data.Models.Metadata.DictionaryBase obj)
- {
- string[] fieldNames = [.. obj.Keys];
- foreach (string fieldName in fieldNames)
- {
- if (obj[fieldName] is null)
- obj.Remove(fieldName);
- }
- }
-
#endregion
}
}
diff --git a/SabreTools.Metadata.DatFiles/DatHeader.cs b/SabreTools.Metadata.DatFiles/DatHeader.cs
index 288f418c..5f8b4a59 100644
--- a/SabreTools.Metadata.DatFiles/DatHeader.cs
+++ b/SabreTools.Metadata.DatFiles/DatHeader.cs
@@ -96,10 +96,11 @@ namespace SabreTools.Metadata.DatFiles
set => _internal.EmulatorVersion = value;
}
- ///
- /// External name of the DAT
- ///
- public string? FileName { get; set; }
+ public string? FileName
+ {
+ get => _internal.FileName;
+ set => _internal.FileName = value;
+ }
public MergingFlag ForceMerging
{
@@ -332,7 +333,6 @@ namespace SabreTools.Metadata.DatFiles
public object Clone() => new DatHeader(GetInternalClone())
{
DatFormat = DatFormat,
- FileName = FileName,
};
///
diff --git a/SabreTools.Metadata.DatItems.Test/DatItemTests.cs b/SabreTools.Metadata.DatItems.Test/DatItemTests.cs
index 3cc3846e..41a74156 100644
--- a/SabreTools.Metadata.DatItems.Test/DatItemTests.cs
+++ b/SabreTools.Metadata.DatItems.Test/DatItemTests.cs
@@ -52,7 +52,7 @@ namespace SabreTools.Metadata.DatItems.Test
///
public override TestDatItemModel GetInternalClone()
{
- return (_internal as TestDatItemModel)?.Clone() as TestDatItemModel ?? [];
+ return (_internal as TestDatItemModel)?.Clone() as TestDatItemModel ?? new();
}
///
diff --git a/SabreTools.Metadata.DatItems/Formats/Adjuster.cs b/SabreTools.Metadata.DatItems/Formats/Adjuster.cs
index affffe81..bc70c791 100644
--- a/SabreTools.Metadata.DatItems/Formats/Adjuster.cs
+++ b/SabreTools.Metadata.DatItems/Formats/Adjuster.cs
@@ -71,7 +71,7 @@ namespace SabreTools.Metadata.DatItems.Formats
///
public override Data.Models.Metadata.Adjuster GetInternalClone()
{
- var adjusterItem = (_internal as Data.Models.Metadata.Adjuster)?.Clone() as Data.Models.Metadata.Adjuster ?? [];
+ var adjusterItem = (_internal as Data.Models.Metadata.Adjuster)?.Clone() as Data.Models.Metadata.Adjuster ?? new();
if (Condition is not null)
adjusterItem.Condition = Condition.GetInternalClone();
diff --git a/SabreTools.Metadata.DatItems/Formats/Analog.cs b/SabreTools.Metadata.DatItems/Formats/Analog.cs
index e8bbe26b..b10964e2 100644
--- a/SabreTools.Metadata.DatItems/Formats/Analog.cs
+++ b/SabreTools.Metadata.DatItems/Formats/Analog.cs
@@ -54,7 +54,7 @@ namespace SabreTools.Metadata.DatItems.Formats
///
public override Data.Models.Metadata.Analog GetInternalClone()
- => (_internal as Data.Models.Metadata.Analog)?.Clone() as Data.Models.Metadata.Analog ?? [];
+ => (_internal as Data.Models.Metadata.Analog)?.Clone() as Data.Models.Metadata.Analog ?? new();
#endregion
diff --git a/SabreTools.Metadata.DatItems/Formats/Archive.cs b/SabreTools.Metadata.DatItems/Formats/Archive.cs
index 5a683212..cff73122 100644
--- a/SabreTools.Metadata.DatItems/Formats/Archive.cs
+++ b/SabreTools.Metadata.DatItems/Formats/Archive.cs
@@ -245,7 +245,7 @@ namespace SabreTools.Metadata.DatItems.Formats
///
public override Data.Models.Metadata.Archive GetInternalClone()
- => (_internal as Data.Models.Metadata.Archive)?.Clone() as Data.Models.Metadata.Archive ?? [];
+ => (_internal as Data.Models.Metadata.Archive)?.Clone() as Data.Models.Metadata.Archive ?? new();
#endregion
diff --git a/SabreTools.Metadata.DatItems/Formats/BiosSet.cs b/SabreTools.Metadata.DatItems/Formats/BiosSet.cs
index 1d9d89b4..f266ecf0 100644
--- a/SabreTools.Metadata.DatItems/Formats/BiosSet.cs
+++ b/SabreTools.Metadata.DatItems/Formats/BiosSet.cs
@@ -66,7 +66,7 @@ namespace SabreTools.Metadata.DatItems.Formats
///
public override Data.Models.Metadata.BiosSet GetInternalClone()
- => (_internal as Data.Models.Metadata.BiosSet)?.Clone() as Data.Models.Metadata.BiosSet ?? [];
+ => (_internal as Data.Models.Metadata.BiosSet)?.Clone() as Data.Models.Metadata.BiosSet ?? new();
#endregion
diff --git a/SabreTools.Metadata.DatItems/Formats/Blank.cs b/SabreTools.Metadata.DatItems/Formats/Blank.cs
index 2843e2b4..7b85232b 100644
--- a/SabreTools.Metadata.DatItems/Formats/Blank.cs
+++ b/SabreTools.Metadata.DatItems/Formats/Blank.cs
@@ -48,7 +48,7 @@ namespace SabreTools.Metadata.DatItems.Formats
///
public override Data.Models.Metadata.Blank GetInternalClone()
- => (_internal as Data.Models.Metadata.Blank)?.Clone() as Data.Models.Metadata.Blank ?? [];
+ => (_internal as Data.Models.Metadata.Blank)?.Clone() as Data.Models.Metadata.Blank ?? new();
#endregion
diff --git a/SabreTools.Metadata.DatItems/Formats/Chip.cs b/SabreTools.Metadata.DatItems/Formats/Chip.cs
index 31540d40..6496de9f 100644
--- a/SabreTools.Metadata.DatItems/Formats/Chip.cs
+++ b/SabreTools.Metadata.DatItems/Formats/Chip.cs
@@ -84,7 +84,7 @@ namespace SabreTools.Metadata.DatItems.Formats
///
public override Data.Models.Metadata.Chip GetInternalClone()
- => (_internal as Data.Models.Metadata.Chip)?.Clone() as Data.Models.Metadata.Chip ?? [];
+ => (_internal as Data.Models.Metadata.Chip)?.Clone() as Data.Models.Metadata.Chip ?? new();
#endregion
diff --git a/SabreTools.Metadata.DatItems/Formats/Condition.cs b/SabreTools.Metadata.DatItems/Formats/Condition.cs
index 29d52d80..25d05b81 100644
--- a/SabreTools.Metadata.DatItems/Formats/Condition.cs
+++ b/SabreTools.Metadata.DatItems/Formats/Condition.cs
@@ -72,7 +72,7 @@ namespace SabreTools.Metadata.DatItems.Formats
///
public override Data.Models.Metadata.Condition GetInternalClone()
- => (_internal as Data.Models.Metadata.Condition)?.Clone() as Data.Models.Metadata.Condition ?? [];
+ => (_internal as Data.Models.Metadata.Condition)?.Clone() as Data.Models.Metadata.Condition ?? new();
#endregion
diff --git a/SabreTools.Metadata.DatItems/Formats/ConfLocation.cs b/SabreTools.Metadata.DatItems/Formats/ConfLocation.cs
index b2163c11..1a392563 100644
--- a/SabreTools.Metadata.DatItems/Formats/ConfLocation.cs
+++ b/SabreTools.Metadata.DatItems/Formats/ConfLocation.cs
@@ -66,7 +66,7 @@ namespace SabreTools.Metadata.DatItems.Formats
///
public override Data.Models.Metadata.ConfLocation GetInternalClone()
- => (_internal as Data.Models.Metadata.ConfLocation)?.Clone() as Data.Models.Metadata.ConfLocation ?? [];
+ => (_internal as Data.Models.Metadata.ConfLocation)?.Clone() as Data.Models.Metadata.ConfLocation ?? new();
#endregion
diff --git a/SabreTools.Metadata.DatItems/Formats/ConfSetting.cs b/SabreTools.Metadata.DatItems/Formats/ConfSetting.cs
index 18260865..c40dad2c 100644
--- a/SabreTools.Metadata.DatItems/Formats/ConfSetting.cs
+++ b/SabreTools.Metadata.DatItems/Formats/ConfSetting.cs
@@ -77,7 +77,7 @@ namespace SabreTools.Metadata.DatItems.Formats
///
public override Data.Models.Metadata.ConfSetting GetInternalClone()
{
- var confSettingItem = (_internal as Data.Models.Metadata.ConfSetting)?.Clone() as Data.Models.Metadata.ConfSetting ?? [];
+ var confSettingItem = (_internal as Data.Models.Metadata.ConfSetting)?.Clone() as Data.Models.Metadata.ConfSetting ?? new();
if (Condition is not null)
confSettingItem.Condition = Condition.GetInternalClone();
diff --git a/SabreTools.Metadata.DatItems/Formats/Configuration.cs b/SabreTools.Metadata.DatItems/Formats/Configuration.cs
index 0aaf48ec..85de6b66 100644
--- a/SabreTools.Metadata.DatItems/Formats/Configuration.cs
+++ b/SabreTools.Metadata.DatItems/Formats/Configuration.cs
@@ -94,7 +94,7 @@ namespace SabreTools.Metadata.DatItems.Formats
///
public override Data.Models.Metadata.Configuration GetInternalClone()
{
- var configurationItem = (_internal as Data.Models.Metadata.Configuration)?.Clone() as Data.Models.Metadata.Configuration ?? [];
+ var configurationItem = (_internal as Data.Models.Metadata.Configuration)?.Clone() as Data.Models.Metadata.Configuration ?? new();
if (Condition is not null)
configurationItem.Condition = Condition.GetInternalClone();
diff --git a/SabreTools.Metadata.DatItems/Formats/Control.cs b/SabreTools.Metadata.DatItems/Formats/Control.cs
index 123b101d..35a0d5c6 100644
--- a/SabreTools.Metadata.DatItems/Formats/Control.cs
+++ b/SabreTools.Metadata.DatItems/Formats/Control.cs
@@ -120,7 +120,7 @@ namespace SabreTools.Metadata.DatItems.Formats
///
public override Data.Models.Metadata.Control GetInternalClone()
- => (_internal as Data.Models.Metadata.Control)?.Clone() as Data.Models.Metadata.Control ?? [];
+ => (_internal as Data.Models.Metadata.Control)?.Clone() as Data.Models.Metadata.Control ?? new();
#endregion
diff --git a/SabreTools.Metadata.DatItems/Formats/DataArea.cs b/SabreTools.Metadata.DatItems/Formats/DataArea.cs
index 141c126d..a60830ff 100644
--- a/SabreTools.Metadata.DatItems/Formats/DataArea.cs
+++ b/SabreTools.Metadata.DatItems/Formats/DataArea.cs
@@ -84,7 +84,7 @@ namespace SabreTools.Metadata.DatItems.Formats
public override Data.Models.Metadata.DataArea GetInternalClone()
{
- var partItem = (_internal as Data.Models.Metadata.DataArea)?.Clone() as Data.Models.Metadata.DataArea ?? [];
+ var partItem = (_internal as Data.Models.Metadata.DataArea)?.Clone() as Data.Models.Metadata.DataArea ?? new();
if (Rom is not null)
partItem.Rom = Array.ConvertAll(Rom, rom => rom.GetInternalClone());
diff --git a/SabreTools.Metadata.DatItems/Formats/Device.cs b/SabreTools.Metadata.DatItems/Formats/Device.cs
index 100fcdfd..58a01385 100644
--- a/SabreTools.Metadata.DatItems/Formats/Device.cs
+++ b/SabreTools.Metadata.DatItems/Formats/Device.cs
@@ -98,7 +98,7 @@ namespace SabreTools.Metadata.DatItems.Formats
///
public override Data.Models.Metadata.Device GetInternalClone()
{
- var deviceItem = (_internal as Data.Models.Metadata.Device)?.Clone() as Data.Models.Metadata.Device ?? [];
+ var deviceItem = (_internal as Data.Models.Metadata.Device)?.Clone() as Data.Models.Metadata.Device ?? new();
deviceItem.DeviceType = DeviceType;
deviceItem.FixedImage = FixedImage;
diff --git a/SabreTools.Metadata.DatItems/Formats/DeviceRef.cs b/SabreTools.Metadata.DatItems/Formats/DeviceRef.cs
index ec169f2a..84688b8a 100644
--- a/SabreTools.Metadata.DatItems/Formats/DeviceRef.cs
+++ b/SabreTools.Metadata.DatItems/Formats/DeviceRef.cs
@@ -54,7 +54,7 @@ namespace SabreTools.Metadata.DatItems.Formats
///
public override Data.Models.Metadata.DeviceRef GetInternalClone()
- => (_internal as Data.Models.Metadata.DeviceRef)?.Clone() as Data.Models.Metadata.DeviceRef ?? [];
+ => (_internal as Data.Models.Metadata.DeviceRef)?.Clone() as Data.Models.Metadata.DeviceRef ?? new();
#endregion
diff --git a/SabreTools.Metadata.DatItems/Formats/DipLocation.cs b/SabreTools.Metadata.DatItems/Formats/DipLocation.cs
index 711c3b2b..ee90e76d 100644
--- a/SabreTools.Metadata.DatItems/Formats/DipLocation.cs
+++ b/SabreTools.Metadata.DatItems/Formats/DipLocation.cs
@@ -66,7 +66,7 @@ namespace SabreTools.Metadata.DatItems.Formats
///
public override Data.Models.Metadata.DipLocation GetInternalClone()
- => (_internal as Data.Models.Metadata.DipLocation)?.Clone() as Data.Models.Metadata.DipLocation ?? [];
+ => (_internal as Data.Models.Metadata.DipLocation)?.Clone() as Data.Models.Metadata.DipLocation ?? new();
#endregion
diff --git a/SabreTools.Metadata.DatItems/Formats/DipSwitch.cs b/SabreTools.Metadata.DatItems/Formats/DipSwitch.cs
index b6758013..4f636028 100644
--- a/SabreTools.Metadata.DatItems/Formats/DipSwitch.cs
+++ b/SabreTools.Metadata.DatItems/Formats/DipSwitch.cs
@@ -121,7 +121,7 @@ namespace SabreTools.Metadata.DatItems.Formats
///
public override Data.Models.Metadata.DipSwitch GetInternalClone()
{
- var dipSwitchItem = (_internal as Data.Models.Metadata.DipSwitch)?.Clone() as Data.Models.Metadata.DipSwitch ?? [];
+ var dipSwitchItem = (_internal as Data.Models.Metadata.DipSwitch)?.Clone() as Data.Models.Metadata.DipSwitch ?? new();
if (Condition is not null)
dipSwitchItem.Condition = Condition.GetInternalClone();
diff --git a/SabreTools.Metadata.DatItems/Formats/DipValue.cs b/SabreTools.Metadata.DatItems/Formats/DipValue.cs
index 33d61db6..2e7bb8c5 100644
--- a/SabreTools.Metadata.DatItems/Formats/DipValue.cs
+++ b/SabreTools.Metadata.DatItems/Formats/DipValue.cs
@@ -77,7 +77,7 @@ namespace SabreTools.Metadata.DatItems.Formats
///
public override Data.Models.Metadata.DipValue GetInternalClone()
{
- var dipValueItem = (_internal as Data.Models.Metadata.DipValue)?.Clone() as Data.Models.Metadata.DipValue ?? [];
+ var dipValueItem = (_internal as Data.Models.Metadata.DipValue)?.Clone() as Data.Models.Metadata.DipValue ?? new();
if (Condition is not null)
dipValueItem.Condition = Condition.GetInternalClone();
diff --git a/SabreTools.Metadata.DatItems/Formats/Disk.cs b/SabreTools.Metadata.DatItems/Formats/Disk.cs
index dfa16d2f..9de6a777 100644
--- a/SabreTools.Metadata.DatItems/Formats/Disk.cs
+++ b/SabreTools.Metadata.DatItems/Formats/Disk.cs
@@ -143,7 +143,7 @@ namespace SabreTools.Metadata.DatItems.Formats
///
public override Data.Models.Metadata.Disk GetInternalClone()
- => (_internal as Data.Models.Metadata.Disk)?.Clone() as Data.Models.Metadata.Disk ?? [];
+ => (_internal as Data.Models.Metadata.Disk)?.Clone() as Data.Models.Metadata.Disk ?? new();
///
/// Convert a disk to the closest Rom approximation
diff --git a/SabreTools.Metadata.DatItems/Formats/DiskArea.cs b/SabreTools.Metadata.DatItems/Formats/DiskArea.cs
index 4ef32fa8..82f19083 100644
--- a/SabreTools.Metadata.DatItems/Formats/DiskArea.cs
+++ b/SabreTools.Metadata.DatItems/Formats/DiskArea.cs
@@ -66,7 +66,7 @@ namespace SabreTools.Metadata.DatItems.Formats
public override Data.Models.Metadata.DiskArea GetInternalClone()
{
- var partItem = (_internal as Data.Models.Metadata.DiskArea)?.Clone() as Data.Models.Metadata.DiskArea ?? [];
+ var partItem = (_internal as Data.Models.Metadata.DiskArea)?.Clone() as Data.Models.Metadata.DiskArea ?? new();
if (Disk is not null)
partItem.Disk = Array.ConvertAll(Disk, rom => rom.GetInternalClone());
diff --git a/SabreTools.Metadata.DatItems/Formats/Display.cs b/SabreTools.Metadata.DatItems/Formats/Display.cs
index 570ee2ba..6642272c 100644
--- a/SabreTools.Metadata.DatItems/Formats/Display.cs
+++ b/SabreTools.Metadata.DatItems/Formats/Display.cs
@@ -161,7 +161,7 @@ namespace SabreTools.Metadata.DatItems.Formats
///
public override Data.Models.Metadata.Display GetInternalClone()
- => (_internal as Data.Models.Metadata.Display)?.Clone() as Data.Models.Metadata.Display ?? [];
+ => (_internal as Data.Models.Metadata.Display)?.Clone() as Data.Models.Metadata.Display ?? new();
#endregion
diff --git a/SabreTools.Metadata.DatItems/Formats/Driver.cs b/SabreTools.Metadata.DatItems/Formats/Driver.cs
index 82068bc4..ffc34aa7 100644
--- a/SabreTools.Metadata.DatItems/Formats/Driver.cs
+++ b/SabreTools.Metadata.DatItems/Formats/Driver.cs
@@ -120,7 +120,7 @@ namespace SabreTools.Metadata.DatItems.Formats
///
public override Data.Models.Metadata.Driver GetInternalClone()
- => (_internal as Data.Models.Metadata.Driver)?.Clone() as Data.Models.Metadata.Driver ?? [];
+ => (_internal as Data.Models.Metadata.Driver)?.Clone() as Data.Models.Metadata.Driver ?? new();
#endregion
diff --git a/SabreTools.Metadata.DatItems/Formats/Extension.cs b/SabreTools.Metadata.DatItems/Formats/Extension.cs
index c9afcb81..99a84580 100644
--- a/SabreTools.Metadata.DatItems/Formats/Extension.cs
+++ b/SabreTools.Metadata.DatItems/Formats/Extension.cs
@@ -54,7 +54,7 @@ namespace SabreTools.Metadata.DatItems.Formats
///
public override Data.Models.Metadata.Extension GetInternalClone()
- => (_internal as Data.Models.Metadata.Extension)?.Clone() as Data.Models.Metadata.Extension ?? [];
+ => (_internal as Data.Models.Metadata.Extension)?.Clone() as Data.Models.Metadata.Extension ?? new();
#endregion
diff --git a/SabreTools.Metadata.DatItems/Formats/Feature.cs b/SabreTools.Metadata.DatItems/Formats/Feature.cs
index 333794a3..f794ec40 100644
--- a/SabreTools.Metadata.DatItems/Formats/Feature.cs
+++ b/SabreTools.Metadata.DatItems/Formats/Feature.cs
@@ -78,7 +78,7 @@ namespace SabreTools.Metadata.DatItems.Formats
///
public override Data.Models.Metadata.Feature GetInternalClone()
- => (_internal as Data.Models.Metadata.Feature)?.Clone() as Data.Models.Metadata.Feature ?? [];
+ => (_internal as Data.Models.Metadata.Feature)?.Clone() as Data.Models.Metadata.Feature ?? new();
#endregion
diff --git a/SabreTools.Metadata.DatItems/Formats/Info.cs b/SabreTools.Metadata.DatItems/Formats/Info.cs
index 64480396..25596e23 100644
--- a/SabreTools.Metadata.DatItems/Formats/Info.cs
+++ b/SabreTools.Metadata.DatItems/Formats/Info.cs
@@ -60,7 +60,7 @@ namespace SabreTools.Metadata.DatItems.Formats
///
public override Data.Models.Metadata.Info GetInternalClone()
- => (_internal as Data.Models.Metadata.Info)?.Clone() as Data.Models.Metadata.Info ?? [];
+ => (_internal as Data.Models.Metadata.Info)?.Clone() as Data.Models.Metadata.Info ?? new();
#endregion
diff --git a/SabreTools.Metadata.DatItems/Formats/Input.cs b/SabreTools.Metadata.DatItems/Formats/Input.cs
index 6dd2801c..4f36e3a6 100644
--- a/SabreTools.Metadata.DatItems/Formats/Input.cs
+++ b/SabreTools.Metadata.DatItems/Formats/Input.cs
@@ -96,7 +96,7 @@ namespace SabreTools.Metadata.DatItems.Formats
///
public override Data.Models.Metadata.Input GetInternalClone()
{
- var inputItem = (_internal as Data.Models.Metadata.Input)?.Clone() as Data.Models.Metadata.Input ?? [];
+ var inputItem = (_internal as Data.Models.Metadata.Input)?.Clone() as Data.Models.Metadata.Input ?? new();
if (Control is not null)
inputItem.Control = Array.ConvertAll(Control, control => control.GetInternalClone());
diff --git a/SabreTools.Metadata.DatItems/Formats/Instance.cs b/SabreTools.Metadata.DatItems/Formats/Instance.cs
index 21de4134..ef488f77 100644
--- a/SabreTools.Metadata.DatItems/Formats/Instance.cs
+++ b/SabreTools.Metadata.DatItems/Formats/Instance.cs
@@ -60,7 +60,7 @@ namespace SabreTools.Metadata.DatItems.Formats
///
public override Data.Models.Metadata.Instance GetInternalClone()
- => (_internal as Data.Models.Metadata.Instance)?.Clone() as Data.Models.Metadata.Instance ?? [];
+ => (_internal as Data.Models.Metadata.Instance)?.Clone() as Data.Models.Metadata.Instance ?? new();
#endregion
diff --git a/SabreTools.Metadata.DatItems/Formats/Media.cs b/SabreTools.Metadata.DatItems/Formats/Media.cs
index 0d389a02..a0f8cf32 100644
--- a/SabreTools.Metadata.DatItems/Formats/Media.cs
+++ b/SabreTools.Metadata.DatItems/Formats/Media.cs
@@ -96,7 +96,7 @@ namespace SabreTools.Metadata.DatItems.Formats
///
public override Data.Models.Metadata.Media GetInternalClone()
- => (_internal as Data.Models.Metadata.Media)?.Clone() as Data.Models.Metadata.Media ?? [];
+ => (_internal as Data.Models.Metadata.Media)?.Clone() as Data.Models.Metadata.Media ?? new();
///
/// Convert a media to the closest Rom approximation
diff --git a/SabreTools.Metadata.DatItems/Formats/Original.cs b/SabreTools.Metadata.DatItems/Formats/Original.cs
index b70be6bd..fa009098 100644
--- a/SabreTools.Metadata.DatItems/Formats/Original.cs
+++ b/SabreTools.Metadata.DatItems/Formats/Original.cs
@@ -35,6 +35,6 @@ namespace SabreTools.Metadata.DatItems.Formats
/// Internal Original model
///
[JsonIgnore]
- private readonly Data.Models.Metadata.Original _internal = [];
+ private readonly Data.Models.Metadata.Original _internal = new();
}
}
diff --git a/SabreTools.Metadata.DatItems/Formats/Part.cs b/SabreTools.Metadata.DatItems/Formats/Part.cs
index 36bf96b3..1bed9778 100644
--- a/SabreTools.Metadata.DatItems/Formats/Part.cs
+++ b/SabreTools.Metadata.DatItems/Formats/Part.cs
@@ -97,7 +97,7 @@ namespace SabreTools.Metadata.DatItems.Formats
///
public override Data.Models.Metadata.Part GetInternalClone()
{
- var partItem = (_internal as Data.Models.Metadata.Part)?.Clone() as Data.Models.Metadata.Part ?? [];
+ var partItem = (_internal as Data.Models.Metadata.Part)?.Clone() as Data.Models.Metadata.Part ?? new();
if (DataArea is not null)
partItem.DataArea = Array.ConvertAll(DataArea, dataArea => dataArea.GetInternalClone());
diff --git a/SabreTools.Metadata.DatItems/Formats/PartFeature.cs b/SabreTools.Metadata.DatItems/Formats/PartFeature.cs
index 4d8c1d7c..ddbc350d 100644
--- a/SabreTools.Metadata.DatItems/Formats/PartFeature.cs
+++ b/SabreTools.Metadata.DatItems/Formats/PartFeature.cs
@@ -83,7 +83,7 @@ namespace SabreTools.Metadata.DatItems.Formats
///
public override Data.Models.Metadata.Feature GetInternalClone()
- => (_internal as Data.Models.Metadata.Feature)?.Clone() as Data.Models.Metadata.Feature ?? [];
+ => (_internal as Data.Models.Metadata.Feature)?.Clone() as Data.Models.Metadata.Feature ?? new();
#endregion
diff --git a/SabreTools.Metadata.DatItems/Formats/Port.cs b/SabreTools.Metadata.DatItems/Formats/Port.cs
index b4945a42..f02216c5 100644
--- a/SabreTools.Metadata.DatItems/Formats/Port.cs
+++ b/SabreTools.Metadata.DatItems/Formats/Port.cs
@@ -66,7 +66,7 @@ namespace SabreTools.Metadata.DatItems.Formats
///
public override Data.Models.Metadata.Port GetInternalClone()
{
- var portItem = (_internal as Data.Models.Metadata.Port)?.Clone() as Data.Models.Metadata.Port ?? [];
+ var portItem = (_internal as Data.Models.Metadata.Port)?.Clone() as Data.Models.Metadata.Port ?? new();
if (Analog is not null)
portItem.Analog = Array.ConvertAll(Analog, analog => analog.GetInternalClone());
diff --git a/SabreTools.Metadata.DatItems/Formats/RamOption.cs b/SabreTools.Metadata.DatItems/Formats/RamOption.cs
index 96ef6500..18455d4d 100644
--- a/SabreTools.Metadata.DatItems/Formats/RamOption.cs
+++ b/SabreTools.Metadata.DatItems/Formats/RamOption.cs
@@ -66,7 +66,7 @@ namespace SabreTools.Metadata.DatItems.Formats
///
public override Data.Models.Metadata.RamOption GetInternalClone()
- => (_internal as Data.Models.Metadata.RamOption)?.Clone() as Data.Models.Metadata.RamOption ?? [];
+ => (_internal as Data.Models.Metadata.RamOption)?.Clone() as Data.Models.Metadata.RamOption ?? new();
#endregion
diff --git a/SabreTools.Metadata.DatItems/Formats/Release.cs b/SabreTools.Metadata.DatItems/Formats/Release.cs
index 3e478f1a..1e73c734 100644
--- a/SabreTools.Metadata.DatItems/Formats/Release.cs
+++ b/SabreTools.Metadata.DatItems/Formats/Release.cs
@@ -78,7 +78,7 @@ namespace SabreTools.Metadata.DatItems.Formats
///
public override Data.Models.Metadata.Release GetInternalClone()
- => (_internal as Data.Models.Metadata.Release)?.Clone() as Data.Models.Metadata.Release ?? [];
+ => (_internal as Data.Models.Metadata.Release)?.Clone() as Data.Models.Metadata.Release ?? new();
#endregion
diff --git a/SabreTools.Metadata.DatItems/Formats/ReleaseDetails.cs b/SabreTools.Metadata.DatItems/Formats/ReleaseDetails.cs
index 4b1484ee..eecd0cd6 100644
--- a/SabreTools.Metadata.DatItems/Formats/ReleaseDetails.cs
+++ b/SabreTools.Metadata.DatItems/Formats/ReleaseDetails.cs
@@ -143,7 +143,7 @@ namespace SabreTools.Metadata.DatItems.Formats
///
public override Data.Models.Metadata.ReleaseDetails GetInternalClone()
- => (_internal as Data.Models.Metadata.ReleaseDetails)?.Clone() as Data.Models.Metadata.ReleaseDetails ?? [];
+ => (_internal as Data.Models.Metadata.ReleaseDetails)?.Clone() as Data.Models.Metadata.ReleaseDetails ?? new();
#endregion
diff --git a/SabreTools.Metadata.DatItems/Formats/Rom.cs b/SabreTools.Metadata.DatItems/Formats/Rom.cs
index 1c74c238..738980d8 100644
--- a/SabreTools.Metadata.DatItems/Formats/Rom.cs
+++ b/SabreTools.Metadata.DatItems/Formats/Rom.cs
@@ -899,7 +899,7 @@ namespace SabreTools.Metadata.DatItems.Formats
///
public override Data.Models.Metadata.Rom GetInternalClone()
- => (_internal as Data.Models.Metadata.Rom)?.Clone() as Data.Models.Metadata.Rom ?? [];
+ => (_internal as Data.Models.Metadata.Rom)?.Clone() as Data.Models.Metadata.Rom ?? new();
#endregion
diff --git a/SabreTools.Metadata.DatItems/Formats/Sample.cs b/SabreTools.Metadata.DatItems/Formats/Sample.cs
index 9838e576..5b55097b 100644
--- a/SabreTools.Metadata.DatItems/Formats/Sample.cs
+++ b/SabreTools.Metadata.DatItems/Formats/Sample.cs
@@ -54,7 +54,7 @@ namespace SabreTools.Metadata.DatItems.Formats
///
public override Data.Models.Metadata.Sample GetInternalClone()
- => (_internal as Data.Models.Metadata.Sample)?.Clone() as Data.Models.Metadata.Sample ?? [];
+ => (_internal as Data.Models.Metadata.Sample)?.Clone() as Data.Models.Metadata.Sample ?? new();
#endregion
diff --git a/SabreTools.Metadata.DatItems/Formats/Serials.cs b/SabreTools.Metadata.DatItems/Formats/Serials.cs
index ea942ff1..4f9e7586 100644
--- a/SabreTools.Metadata.DatItems/Formats/Serials.cs
+++ b/SabreTools.Metadata.DatItems/Formats/Serials.cs
@@ -132,7 +132,7 @@ namespace SabreTools.Metadata.DatItems.Formats
///
public override Data.Models.Metadata.Serials GetInternalClone()
- => (_internal as Data.Models.Metadata.Serials)?.Clone() as Data.Models.Metadata.Serials ?? [];
+ => (_internal as Data.Models.Metadata.Serials)?.Clone() as Data.Models.Metadata.Serials ?? new();
#endregion
diff --git a/SabreTools.Metadata.DatItems/Formats/SharedFeat.cs b/SabreTools.Metadata.DatItems/Formats/SharedFeat.cs
index baab238c..5729d01e 100644
--- a/SabreTools.Metadata.DatItems/Formats/SharedFeat.cs
+++ b/SabreTools.Metadata.DatItems/Formats/SharedFeat.cs
@@ -60,7 +60,7 @@ namespace SabreTools.Metadata.DatItems.Formats
///
public override Data.Models.Metadata.SharedFeat GetInternalClone()
- => (_internal as Data.Models.Metadata.SharedFeat)?.Clone() as Data.Models.Metadata.SharedFeat ?? [];
+ => (_internal as Data.Models.Metadata.SharedFeat)?.Clone() as Data.Models.Metadata.SharedFeat ?? new();
#endregion
diff --git a/SabreTools.Metadata.DatItems/Formats/Slot.cs b/SabreTools.Metadata.DatItems/Formats/Slot.cs
index 1f8d994a..3d5ae947 100644
--- a/SabreTools.Metadata.DatItems/Formats/Slot.cs
+++ b/SabreTools.Metadata.DatItems/Formats/Slot.cs
@@ -66,7 +66,7 @@ namespace SabreTools.Metadata.DatItems.Formats
///
public override Data.Models.Metadata.Slot GetInternalClone()
{
- var slotItem = (_internal as Data.Models.Metadata.Slot)?.Clone() as Data.Models.Metadata.Slot ?? [];
+ var slotItem = (_internal as Data.Models.Metadata.Slot)?.Clone() as Data.Models.Metadata.Slot ?? new();
if (SlotOption is not null)
slotItem.SlotOption = Array.ConvertAll(SlotOption, slotOption => slotOption.GetInternalClone());
diff --git a/SabreTools.Metadata.DatItems/Formats/SlotOption.cs b/SabreTools.Metadata.DatItems/Formats/SlotOption.cs
index 9e6b24ff..ad350682 100644
--- a/SabreTools.Metadata.DatItems/Formats/SlotOption.cs
+++ b/SabreTools.Metadata.DatItems/Formats/SlotOption.cs
@@ -66,7 +66,7 @@ namespace SabreTools.Metadata.DatItems.Formats
///
public override Data.Models.Metadata.SlotOption GetInternalClone()
- => (_internal as Data.Models.Metadata.SlotOption)?.Clone() as Data.Models.Metadata.SlotOption ?? [];
+ => (_internal as Data.Models.Metadata.SlotOption)?.Clone() as Data.Models.Metadata.SlotOption ?? new();
#endregion
diff --git a/SabreTools.Metadata.DatItems/Formats/SoftwareList.cs b/SabreTools.Metadata.DatItems/Formats/SoftwareList.cs
index 54b87152..0ea02cfe 100644
--- a/SabreTools.Metadata.DatItems/Formats/SoftwareList.cs
+++ b/SabreTools.Metadata.DatItems/Formats/SoftwareList.cs
@@ -72,7 +72,7 @@ namespace SabreTools.Metadata.DatItems.Formats
///
public override Data.Models.Metadata.SoftwareList GetInternalClone()
- => (_internal as Data.Models.Metadata.SoftwareList)?.Clone() as Data.Models.Metadata.SoftwareList ?? [];
+ => (_internal as Data.Models.Metadata.SoftwareList)?.Clone() as Data.Models.Metadata.SoftwareList ?? new();
#endregion
diff --git a/SabreTools.Metadata.DatItems/Formats/Sound.cs b/SabreTools.Metadata.DatItems/Formats/Sound.cs
index b0fa077e..6cd2db8c 100644
--- a/SabreTools.Metadata.DatItems/Formats/Sound.cs
+++ b/SabreTools.Metadata.DatItems/Formats/Sound.cs
@@ -54,7 +54,7 @@ namespace SabreTools.Metadata.DatItems.Formats
///
public override Data.Models.Metadata.Sound GetInternalClone()
- => (_internal as Data.Models.Metadata.Sound)?.Clone() as Data.Models.Metadata.Sound ?? [];
+ => (_internal as Data.Models.Metadata.Sound)?.Clone() as Data.Models.Metadata.Sound ?? new();
#endregion
diff --git a/SabreTools.Metadata.DatItems/Formats/SourceDetails.cs b/SabreTools.Metadata.DatItems/Formats/SourceDetails.cs
index eebdc473..27241376 100644
--- a/SabreTools.Metadata.DatItems/Formats/SourceDetails.cs
+++ b/SabreTools.Metadata.DatItems/Formats/SourceDetails.cs
@@ -192,7 +192,7 @@ namespace SabreTools.Metadata.DatItems.Formats
///
public override Data.Models.Metadata.SourceDetails GetInternalClone()
- => (_internal as Data.Models.Metadata.SourceDetails)?.Clone() as Data.Models.Metadata.SourceDetails ?? [];
+ => (_internal as Data.Models.Metadata.SourceDetails)?.Clone() as Data.Models.Metadata.SourceDetails ?? new();
#endregion
diff --git a/SabreTools.Metadata.DatItems/Machine.cs b/SabreTools.Metadata.DatItems/Machine.cs
index 6de98838..a5c28ae5 100644
--- a/SabreTools.Metadata.DatItems/Machine.cs
+++ b/SabreTools.Metadata.DatItems/Machine.cs
@@ -386,12 +386,12 @@ namespace SabreTools.Metadata.DatItems
public Machine()
{
- _internal = [];
+ _internal = new();
}
public Machine(Data.Models.Metadata.Machine machine)
{
- _internal = machine.Clone() as Data.Models.Metadata.Machine ?? [];
+ _internal = machine.Clone() as Data.Models.Metadata.Machine ?? new();
// Clear all lists
_internal.Adjuster = null;
@@ -449,7 +449,7 @@ namespace SabreTools.Metadata.DatItems
///
/// Get a clone of the current internal model
///
- public Data.Models.Metadata.Machine GetInternalClone() => (_internal.Clone() as Data.Models.Metadata.Machine) ?? [];
+ public Data.Models.Metadata.Machine GetInternalClone() => (_internal.Clone() as Data.Models.Metadata.Machine) ?? new();
#endregion
diff --git a/SabreTools.Metadata.Filter/FilterGroup.cs b/SabreTools.Metadata.Filter/FilterGroup.cs
index 6987d165..cbc2b98e 100644
--- a/SabreTools.Metadata.Filter/FilterGroup.cs
+++ b/SabreTools.Metadata.Filter/FilterGroup.cs
@@ -1,6 +1,5 @@
using System.Collections.Generic;
using System.Text.RegularExpressions;
-using SabreTools.Data.Models.Metadata;
namespace SabreTools.Metadata.Filter
{
@@ -65,14 +64,14 @@ namespace SabreTools.Metadata.Filter
#region Matching
///
- /// Determine if a DictionaryBase object matches the group
+ /// Determine if a object matches the group
///
- public bool Matches(DictionaryBase dictionaryBase)
+ public bool Matches(object obj)
{
return GroupType switch
{
- GroupType.AND => MatchesAnd(dictionaryBase),
- GroupType.OR => MatchesOr(dictionaryBase),
+ GroupType.AND => MatchesAnd(obj),
+ GroupType.OR => MatchesOr(obj),
GroupType.NONE => false,
_ => false,
@@ -82,13 +81,13 @@ namespace SabreTools.Metadata.Filter
///
/// Determines if a value matches all filters
///
- private bool MatchesAnd(DictionaryBase dictionaryBase)
+ private bool MatchesAnd(object obj)
{
// Run standalone filters
foreach (var filter in _subfilters)
{
// One failed match fails the group
- if (!filter.Matches(dictionaryBase))
+ if (!filter.Matches(obj))
return false;
}
@@ -96,7 +95,7 @@ namespace SabreTools.Metadata.Filter
foreach (var group in _subgroups)
{
// One failed match fails the group
- if (!group.Matches(dictionaryBase))
+ if (!group.Matches(obj))
return false;
}
@@ -106,13 +105,13 @@ namespace SabreTools.Metadata.Filter
///
/// Determines if a value matches any filters
///
- private bool MatchesOr(DictionaryBase dictionaryBase)
+ private bool MatchesOr(object obj)
{
// Run standalone filters
foreach (var filter in _subfilters)
{
// One successful match passes the group
- if (filter.Matches(dictionaryBase))
+ if (filter.Matches(obj))
return true;
}
@@ -120,7 +119,7 @@ namespace SabreTools.Metadata.Filter
foreach (var group in _subgroups)
{
// One successful match passes the group
- if (group.Matches(dictionaryBase))
+ if (group.Matches(obj))
return true;
}
diff --git a/SabreTools.Metadata.Filter/FilterObject.cs b/SabreTools.Metadata.Filter/FilterObject.cs
index 08861adb..1e4db5d7 100644
--- a/SabreTools.Metadata.Filter/FilterObject.cs
+++ b/SabreTools.Metadata.Filter/FilterObject.cs
@@ -54,18 +54,18 @@ namespace SabreTools.Metadata.Filter
#region Matching
///
- /// Determine if a DictionaryBase object matches the key and value
+ /// Determine if a object matches the key and value
///
- public bool Matches(DictionaryBase dictionaryBase)
+ public bool Matches(object obj)
{
return Operation switch
{
- Operation.Equals => MatchesEqual(dictionaryBase),
- Operation.NotEquals => MatchesNotEqual(dictionaryBase),
- Operation.GreaterThan => MatchesGreaterThan(dictionaryBase),
- Operation.GreaterThanOrEqual => MatchesGreaterThanOrEqual(dictionaryBase),
- Operation.LessThan => MatchesLessThan(dictionaryBase),
- Operation.LessThanOrEqual => MatchesLessThanOrEqual(dictionaryBase),
+ Operation.Equals => MatchesEqual(obj),
+ Operation.NotEquals => MatchesNotEqual(obj),
+ Operation.GreaterThan => MatchesGreaterThan(obj),
+ Operation.GreaterThanOrEqual => MatchesGreaterThanOrEqual(obj),
+ Operation.LessThan => MatchesLessThan(obj),
+ Operation.LessThanOrEqual => MatchesLessThanOrEqual(obj),
Operation.NONE => false,
_ => false,
@@ -75,10 +75,10 @@ namespace SabreTools.Metadata.Filter
///
/// Determines if a value matches exactly
///
- private bool MatchesEqual(DictionaryBase dictionaryBase)
+ private bool MatchesEqual(object obj)
{
// Process the check value
- if (!GetCheckValue(dictionaryBase, Key.FieldName, out string? checkValue))
+ if (!GetCheckValue(obj, Key.FieldName, out string? checkValue))
return string.IsNullOrEmpty(Value);
// If a null value is expected
@@ -117,10 +117,10 @@ namespace SabreTools.Metadata.Filter
///
/// Determines if a value does not match exactly
///
- private bool MatchesNotEqual(DictionaryBase dictionaryBase)
+ private bool MatchesNotEqual(object obj)
{
// Process the check value
- if (!GetCheckValue(dictionaryBase, Key.FieldName, out string? checkValue))
+ if (!GetCheckValue(obj, Key.FieldName, out string? checkValue))
return string.IsNullOrEmpty(Value);
// If a null value is expected
@@ -159,10 +159,10 @@ namespace SabreTools.Metadata.Filter
///
/// Determines if a value is strictly greater than
///
- private bool MatchesGreaterThan(DictionaryBase dictionaryBase)
+ private bool MatchesGreaterThan(object obj)
{
// Process the check value
- if (!GetCheckValue(dictionaryBase, Key.FieldName, out string? checkValue))
+ if (!GetCheckValue(obj, Key.FieldName, out string? checkValue))
return string.IsNullOrEmpty(Value);
// Null is always failure
@@ -191,10 +191,10 @@ namespace SabreTools.Metadata.Filter
///
/// Determines if a value is greater than or equal
///
- private bool MatchesGreaterThanOrEqual(DictionaryBase dictionaryBase)
+ private bool MatchesGreaterThanOrEqual(object obj)
{
// Process the check value
- if (!GetCheckValue(dictionaryBase, Key.FieldName, out string? checkValue))
+ if (!GetCheckValue(obj, Key.FieldName, out string? checkValue))
return string.IsNullOrEmpty(Value);
// Null is always failure
@@ -223,10 +223,10 @@ namespace SabreTools.Metadata.Filter
///
/// Determines if a value is strictly less than
///
- private bool MatchesLessThan(DictionaryBase dictionaryBase)
+ private bool MatchesLessThan(object obj)
{
// Process the check value
- if (!GetCheckValue(dictionaryBase, Key.FieldName, out string? checkValue))
+ if (!GetCheckValue(obj, Key.FieldName, out string? checkValue))
return string.IsNullOrEmpty(Value);
// Null is always failure
@@ -255,10 +255,10 @@ namespace SabreTools.Metadata.Filter
///
/// Determines if a value is less than or equal
///
- private bool MatchesLessThanOrEqual(DictionaryBase dictionaryBase)
+ private bool MatchesLessThanOrEqual(object obj)
{
// Process the check value
- if (!GetCheckValue(dictionaryBase, Key.FieldName, out string? checkValue))
+ if (!GetCheckValue(obj, Key.FieldName, out string? checkValue))
return string.IsNullOrEmpty(Value);
// Null is always failure
@@ -334,12 +334,13 @@ namespace SabreTools.Metadata.Filter
}
///
- /// Get the check value for a field from a DictionaryBase
+ /// Get the check value for a field
///
- private static bool GetCheckValue(DictionaryBase dictionaryBase, string fieldName, out string? checkValue)
+ /// TODO: Figure out how to not have this hardcoded
+ private static bool GetCheckValue(object obj, string fieldName, out string? checkValue)
{
// Handle type-specific properties
- switch (dictionaryBase)
+ switch (obj)
{
case Adjuster item when fieldName == "default":
checkValue = item.Default.FromYesNo();
@@ -802,6 +803,9 @@ namespace SabreTools.Metadata.Filter
case Header item when fieldName == "emulatorversion":
checkValue = item.EmulatorVersion;
return true;
+ case Header item when fieldName == "filename":
+ checkValue = item.FileName;
+ return true;
case Header item when fieldName == "forcemerging":
checkValue = item.ForceMerging.AsStringValue();
return true;
@@ -1689,15 +1693,8 @@ namespace SabreTools.Metadata.Filter
}
// If the key doesn't exist, we count it as null
- if (!dictionaryBase.ContainsKey(fieldName))
- {
- checkValue = null;
- return false;
- }
-
- // If the value in the dictionary is null
- checkValue = dictionaryBase.ReadString(fieldName);
- return true;
+ checkValue = null;
+ return false;
}
///
diff --git a/SabreTools.Metadata.Filter/FilterRunner.cs b/SabreTools.Metadata.Filter/FilterRunner.cs
index 440731a8..433a3037 100644
--- a/SabreTools.Metadata.Filter/FilterRunner.cs
+++ b/SabreTools.Metadata.Filter/FilterRunner.cs
@@ -30,15 +30,15 @@ namespace SabreTools.Metadata.Filter
}
///
- /// Run filtering on a DictionaryBase item
+ /// Run filtering on an item
///
- public bool Run(DictionaryBase dictionaryBase)
+ public bool Run(object obj)
{
- string? itemName = dictionaryBase switch
+ string? itemName = obj switch
{
Header => "header",
Machine => "machine",
- DatItem => TypeHelper.GetXmlRootAttributeElementName(dictionaryBase.GetType()),
+ DatItem => TypeHelper.GetXmlRootAttributeElementName(obj.GetType()),
_ => null,
};
@@ -56,7 +56,7 @@ namespace SabreTools.Metadata.Filter
continue;
// If we don't get a match, it's a failure
- bool matchOne = Filters[filterKey].Matches(dictionaryBase);
+ bool matchOne = Filters[filterKey].Matches(obj);
if (!matchOne)
return false;
}
diff --git a/SabreTools.Metadata.Test/ModelBackedItemTests.cs b/SabreTools.Metadata.Test/ModelBackedItemTests.cs
deleted file mode 100644
index 7ae485ee..00000000
--- a/SabreTools.Metadata.Test/ModelBackedItemTests.cs
+++ /dev/null
@@ -1,257 +0,0 @@
-using SabreTools.Data.Models.Metadata;
-using Xunit;
-
-namespace SabreTools.Metadata.Test
-{
- public class ModelBackedItemTests
- {
- #region Private Testing Classes
-
- ///
- /// Testing implementation of DictionaryBase
- ///
- private class TestDictionaryBase : DictionaryBase
- {
- public const string NameKey = "__NAME__";
- }
-
- ///
- /// Testing implementation of ModelBackedItem
- ///
- private class TestModelBackedItem : ModelBackedItem
- {
- #region Comparision Methods
-
- ///
- public override bool Equals(ModelBackedItem? other)
- {
- // If other is null
- if (other is null)
- return false;
-
- // If the type is mismatched
- if (other is not TestModelBackedItem otherItem)
- return false;
-
- // Compare internal models
- return _internal.Equals(otherItem._internal);
- }
-
- ///
- public override bool Equals(ModelBackedItem? other)
- {
- // If other is null
- if (other is null)
- return false;
-
- // If the type is mismatched
- if (other is not TestModelBackedItem otherItem)
- return false;
-
- // Compare internal models
- return _internal.Equals(otherItem._internal);
- }
-
- #endregion
- }
-
- ///
- /// Alternate testing implementation of ModelBackedItem
- ///
- private class TestModelAltBackedItem : ModelBackedItem
- {
- #region Comparision Methods
-
- ///
- public override bool Equals(ModelBackedItem? other)
- {
- // If other is null
- if (other is null)
- return false;
-
- // If the type is mismatched
- if (other is not TestModelAltBackedItem otherItem)
- return false;
-
- // Compare internal models
- return _internal[TestDictionaryBase.NameKey] == otherItem._internal[TestDictionaryBase.NameKey];
- }
-
- ///
- public override bool Equals(ModelBackedItem? other)
- {
- // If other is null
- if (other is null)
- return false;
-
- // If the type is mismatched
- if (other is not TestModelAltBackedItem otherItem)
- return false;
-
- // Compare internal models
- return _internal[TestDictionaryBase.NameKey] == otherItem._internal[TestDictionaryBase.NameKey];
- }
-
- #endregion
- }
-
- #endregion
-
- #region Remove
-
- [Fact]
- public void Remove_NullItem_False()
- {
- TestModelBackedItem? modelBackedItem = null;
- string? fieldName = TestDictionaryBase.NameKey;
- bool? actual = modelBackedItem?.Remove(fieldName);
- Assert.Null(actual);
- }
-
- [Fact]
- public void Remove_EmptyFieldName_False()
- {
- var modelBackedItem = new TestModelBackedItem();
- string? fieldName = string.Empty;
- bool actual = modelBackedItem.Remove(fieldName);
- Assert.False(actual);
- }
-
- [Fact]
- public void Remove_MissingKey_True()
- {
- var modelBackedItem = new TestModelBackedItem();
- string? fieldName = TestDictionaryBase.NameKey;
- bool actual = modelBackedItem.Remove(fieldName);
- Assert.True(actual);
- Assert.Null(modelBackedItem.ReadString(fieldName));
- }
-
- [Fact]
- public void Remove_ValidKey_True()
- {
- var modelBackedItem = new TestModelBackedItem();
- modelBackedItem.Write(TestDictionaryBase.NameKey, "value");
- string? fieldName = TestDictionaryBase.NameKey;
- bool actual = modelBackedItem.Remove(fieldName);
- Assert.True(actual);
- Assert.Null(modelBackedItem.ReadString(fieldName));
- }
-
- #endregion
-
- #region Replace
-
- [Fact]
- public void Replace_NullFrom_False()
- {
- TestModelBackedItem? from = null;
- var to = new TestModelBackedItem();
- string? fieldName = TestDictionaryBase.NameKey;
- bool actual = to.Replace(from, fieldName);
- Assert.False(actual);
- }
-
- [Fact]
- public void Replace_NullTo_False()
- {
- TestModelBackedItem? from = null;
- TestModelBackedItem? to = new TestModelBackedItem();
- string? fieldName = TestDictionaryBase.NameKey;
- bool actual = to.Replace(from, fieldName);
- Assert.False(actual);
- }
-
- [Fact]
- public void Replace_EmptyFieldName_False()
- {
- TestModelBackedItem? from = new TestModelBackedItem();
- TestModelBackedItem? to = new TestModelBackedItem();
- string? fieldName = string.Empty;
- bool actual = to.Replace(from, fieldName);
- Assert.False(actual);
- }
-
- [Fact]
- public void Replace_MissingKey_False()
- {
- TestModelBackedItem? from = new TestModelBackedItem();
- TestModelBackedItem? to = new TestModelBackedItem();
- string? fieldName = TestDictionaryBase.NameKey;
- bool actual = to.Replace(from, fieldName);
- Assert.False(actual);
- }
-
- [Fact]
- public void Replace_ValidKey_True()
- {
- TestModelBackedItem? from = new TestModelBackedItem();
- from.Write(TestDictionaryBase.NameKey, "value");
- TestModelBackedItem? to = new TestModelBackedItem();
- string? fieldName = TestDictionaryBase.NameKey;
- bool actual = to.Replace(from, fieldName);
- Assert.True(actual);
- Assert.Equal("value", to.ReadString(TestDictionaryBase.NameKey));
- }
-
- #endregion
-
- #region WriteWithValidation
-
- [Fact]
- public void WriteWithValidation_NullItem_False()
- {
- TestModelBackedItem? modelBackedItem = null;
- string? fieldName = TestDictionaryBase.NameKey;
- object value = "value";
- bool? actual = modelBackedItem?.WriteWithValidation(fieldName, value);
- Assert.Null(actual);
- }
-
- [Fact]
- public void WriteWithValidation_EmptyFieldName_False()
- {
- TestModelBackedItem? modelBackedItem = new TestModelBackedItem();
- string? fieldName = string.Empty;
- object value = "value";
- bool actual = modelBackedItem.WriteWithValidation(fieldName, value);
- Assert.False(actual);
- }
-
- [Fact]
- public void WriteWithValidation_MissingKey_False()
- {
- TestModelBackedItem? modelBackedItem = new TestModelBackedItem();
- string? fieldName = "sha1";
- object value = "value";
- bool actual = modelBackedItem.WriteWithValidation(fieldName, value);
- Assert.False(actual);
- }
-
- [Fact]
- public void WriteWithValidation_InvalidKey_True()
- {
- TestModelBackedItem? modelBackedItem = new TestModelBackedItem();
- modelBackedItem.Write(TestDictionaryBase.NameKey, "old");
- string? fieldName = "INVALID";
- object value = "value";
- bool actual = modelBackedItem.WriteWithValidation(fieldName, value);
- Assert.False(actual);
- Assert.Null(modelBackedItem.ReadString(fieldName));
- }
-
- [Fact]
- public void WriteWithValidation_ValidKey_True()
- {
- TestModelBackedItem? modelBackedItem = new TestModelBackedItem();
- modelBackedItem.Write(TestDictionaryBase.NameKey, "old");
- string? fieldName = TestDictionaryBase.NameKey;
- object value = "value";
- bool actual = modelBackedItem.WriteWithValidation(fieldName, value);
- Assert.True(actual);
- Assert.Equal(value, modelBackedItem.ReadString(fieldName));
- }
-
- #endregion
- }
-}
diff --git a/SabreTools.Metadata/ModelBackedItem.cs b/SabreTools.Metadata/ModelBackedItem.cs
index de5e7cdf..d70d4edb 100644
--- a/SabreTools.Metadata/ModelBackedItem.cs
+++ b/SabreTools.Metadata/ModelBackedItem.cs
@@ -3,7 +3,7 @@
namespace SabreTools.Metadata
{
///
- /// Represents an item that's backed by a DictionaryBase item
+ /// Represents an item that's backed by a constructable item
///
public abstract class ModelBackedItem : IEquatable
{
diff --git a/SabreTools.Metadata/ModelBackedItemT.cs b/SabreTools.Metadata/ModelBackedItemT.cs
index a80fe78b..7c419df0 100644
--- a/SabreTools.Metadata/ModelBackedItemT.cs
+++ b/SabreTools.Metadata/ModelBackedItemT.cs
@@ -5,9 +5,9 @@ using Newtonsoft.Json;
namespace SabreTools.Metadata
{
///
- /// Represents an item that's backed by a DictionaryBase item
+ /// Represents an item that's backed by a constructable item
///
- public abstract class ModelBackedItem : ModelBackedItem, IEquatable> where T : Data.Models.Metadata.DictionaryBase
+ public abstract class ModelBackedItem : ModelBackedItem, IEquatable> where T : new()
{
///
/// Internal model wrapped by this DatItem
@@ -19,98 +19,7 @@ namespace SabreTools.Metadata
public ModelBackedItem()
{
- _internal = Activator.CreateInstance();
- }
-
- #endregion
-
- #region Accessors
-
- ///
- /// Get the value from a field based on the type provided
- ///
- /// Type of the value to get from the internal model
- /// Field to retrieve
- /// Value from the field, if possible
- public U? Read(string fieldName)
- => _internal.Read(fieldName);
-
- ///
- /// Get the value from a field based on the type provided
- ///
- /// Field to retrieve
- /// Value from the field, if possible
- /// TODO: Determine if this can be removed
- public bool? ReadBool(string fieldName)
- => _internal.ReadBool(fieldName);
-
- ///
- /// Get the value from a field based on the type provided
- ///
- /// Field to retrieve
- /// Value from the field, if possible
- /// TODO: Determine if this can be removed
- public double? ReadDouble(string fieldName)
- => _internal.ReadDouble(fieldName);
-
- ///
- /// Get the value from a field based on the type provided
- ///
- /// Field to retrieve
- /// Value from the field, if possible
- /// TODO: Determine if this can be removed
- public long? ReadLong(string fieldName)
- => _internal.ReadLong(fieldName);
-
- ///
- /// Get the value from a field based on the type provided
- ///
- /// Field to retrieve
- /// Value from the field, if possible
- public string? ReadString(string fieldName)
- => _internal.ReadString(fieldName);
-
- ///
- /// Get the value from a field based on the type provided
- ///
- /// Field to retrieve
- /// Value from the field, if possible
- /// TODO: Determine if this can be removed
- public string[]? ReadStringArray(string fieldName)
- => _internal.ReadStringArray(fieldName);
-
- ///
- /// Set the value from a field based on the type provided
- ///
- /// Type of the value to set in the internal model
- /// Field to set
- /// Value to set
- /// True if the value was set, false otherwise
- public bool Write(string fieldName, U? value)
- => _internal.Write(fieldName, value);
-
- ///
- /// Set a field from the backing item validating the field is expected
- ///
- /// TODO: Figure out how to add this to DictionaryBase
- public bool WriteWithValidation(string fieldName, object value)
- {
- // If the item or field name are missing, we can't do anything
- if (string.IsNullOrEmpty(fieldName))
- return false;
-
- // Retrieve the list of valid fields for the item
- var constants = TypeHelper.GetConstants(_internal.GetType());
- if (constants is null)
- return false;
-
- // Get the value that matches the field name provided
- string? realField = Array.Find(constants, c => string.Equals(c, fieldName, StringComparison.OrdinalIgnoreCase));
- if (realField is null)
- return false;
-
- // Set the field with the new value
- return _internal.Write(realField, value);
+ _internal = new T();
}
#endregion
@@ -121,21 +30,5 @@ namespace SabreTools.Metadata
public abstract bool Equals(ModelBackedItem? other);
#endregion
-
- #region Manipulation
-
- ///
- /// Remove a field from the backing item
- ///
- public bool Remove(string fieldName)
- => _internal.Remove(fieldName);
-
- ///
- /// Replace a field from another ModelBackedItem
- ///
- public bool Replace(ModelBackedItem? from, string fieldName)
- => _internal.Replace(from?._internal, fieldName);
-
- #endregion
}
}
diff --git a/SabreTools.Serialization.CrossModel/ClrMamePro.Deserializer.cs b/SabreTools.Serialization.CrossModel/ClrMamePro.Deserializer.cs
index 667e177c..3bd9a6d0 100644
--- a/SabreTools.Serialization.CrossModel/ClrMamePro.Deserializer.cs
+++ b/SabreTools.Serialization.CrossModel/ClrMamePro.Deserializer.cs
@@ -352,7 +352,7 @@ namespace SabreTools.Serialization.CrossModel
{
var info = new Info();
- var sources = item.Read(Data.Models.Metadata.InfoSource.SourceKey);
+ var sources = item.Source;
if (sources is not null && sources.Length > 0)
info.Source = [.. sources];
diff --git a/SabreTools.Serialization.CrossModel/ClrMamePro.Serializer.cs b/SabreTools.Serialization.CrossModel/ClrMamePro.Serializer.cs
index 1bb8856c..bf4b61ed 100644
--- a/SabreTools.Serialization.CrossModel/ClrMamePro.Serializer.cs
+++ b/SabreTools.Serialization.CrossModel/ClrMamePro.Serializer.cs
@@ -337,10 +337,7 @@ namespace SabreTools.Serialization.CrossModel
var sources = item.Source;
if (sources is not null && sources.Length > 0)
- {
- string[] sourcesCopy = [.. sources];
- infoSource[Data.Models.Metadata.InfoSource.SourceKey] = sourcesCopy;
- }
+ infoSource.Source = [.. sources];
return infoSource;
}
diff --git a/SabreTools.Serialization.CrossModel/Logiqx.Serializer.cs b/SabreTools.Serialization.CrossModel/Logiqx.Serializer.cs
index 133074b3..2cbb2149 100644
--- a/SabreTools.Serialization.CrossModel/Logiqx.Serializer.cs
+++ b/SabreTools.Serialization.CrossModel/Logiqx.Serializer.cs
@@ -37,7 +37,7 @@ namespace SabreTools.Serialization.CrossModel
///
private static Data.Models.Metadata.Header ConvertHeaderToInternalModel(Datafile item)
{
- var header = item.Header is not null ? ConvertHeaderToInternalModel(item.Header) : [];
+ var header = item.Header is not null ? ConvertHeaderToInternalModel(item.Header) : new();
header.Build = item.Build;
header.Debug = item.Debug;
diff --git a/SabreTools.Serialization.CrossModel/RomCenter.Deserializer.cs b/SabreTools.Serialization.CrossModel/RomCenter.Deserializer.cs
index 80d5e5cf..21361396 100644
--- a/SabreTools.Serialization.CrossModel/RomCenter.Deserializer.cs
+++ b/SabreTools.Serialization.CrossModel/RomCenter.Deserializer.cs
@@ -66,8 +66,7 @@ namespace SabreTools.Serialization.CrossModel
};
}
- if (item.RefName != null
- || item.EmulatorVersion != null)
+ if (item.RefName != null || item.EmulatorVersion != null)
{
metadataFile.Emulator = new Emulator
{
diff --git a/SabreTools.Serialization.CrossModel/SeparatedValue.Deserializer.cs b/SabreTools.Serialization.CrossModel/SeparatedValue.Deserializer.cs
index f055090f..b5349057 100644
--- a/SabreTools.Serialization.CrossModel/SeparatedValue.Deserializer.cs
+++ b/SabreTools.Serialization.CrossModel/SeparatedValue.Deserializer.cs
@@ -76,7 +76,7 @@ namespace SabreTools.Serialization.CrossModel
{
var row = new Row
{
- FileName = header?.ReadString("FILENAME"), // TODO: Make this an actual key to retrieve
+ FileName = header?.FileName,
InternalName = header?.Name,
Description = header?.Description,
GameName = parent.Name,
@@ -104,7 +104,7 @@ namespace SabreTools.Serialization.CrossModel
{
var row = new Row
{
- FileName = header?.ReadString("FILENAME"), // TODO: Make this an actual key to retrieve on an item -- OriginalFilename
+ FileName = header?.FileName,
InternalName = header?.Name,
Description = header?.Description,
GameName = parent.Name,
@@ -131,7 +131,7 @@ namespace SabreTools.Serialization.CrossModel
{
var row = new Row
{
- FileName = header?.ReadString("FILENAME"), // TODO: Make this an actual key to retrieve
+ FileName = header?.FileName,
InternalName = header?.Name,
Description = header?.Description,
GameName = parent.Name,
diff --git a/SabreTools.Serialization.CrossModel/SeparatedValue.Serializer.cs b/SabreTools.Serialization.CrossModel/SeparatedValue.Serializer.cs
index 5b6b722d..bd619c66 100644
--- a/SabreTools.Serialization.CrossModel/SeparatedValue.Serializer.cs
+++ b/SabreTools.Serialization.CrossModel/SeparatedValue.Serializer.cs
@@ -35,7 +35,7 @@ namespace SabreTools.Serialization.CrossModel
if (item.Row is not null && item.Row.Length > 0)
{
var first = item.Row[0];
- header["FILENAME"] = first.FileName; // TODO: Make this an actual key to retrieve on an item -- OriginalFilename
+ header.FileName = first.FileName;
header.Name = first.FileName;
header.Description = first.Description;
}