From ca3ebf33a8c8bba0e01b39303e2ea00998e28c27 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Thu, 9 Apr 2026 22:21:15 -0400 Subject: [PATCH] Flatten Analog out of existence --- .../MetadataExtensionsTests.cs | 2 - .../MetadataExtensions.cs | 2 - SabreTools.Data.Models/Metadata/Analog.cs | 44 ---------- SabreTools.Data.Models/Metadata/Enums.cs | 1 - SabreTools.Data.Models/Metadata/Port.cs | 6 +- .../DatFileTests.FromMetadata.cs | 24 ++---- .../DatFileTests.ToMetadata.cs | 14 +--- .../Formats/SabreJSON.cs | 3 - SabreTools.Metadata.DatItems/DatItem.cs | 1 - .../Formats/Analog.cs | 80 ------------------- SabreTools.Metadata.DatItems/Formats/Port.cs | 52 ++---------- .../FilterObjectTests.cs | 20 +---- SabreTools.Metadata.Filter/FilterKey.cs | 10 +-- SabreTools.Metadata.Filter/FilterObject.cs | 23 +----- .../Listxml.Deserializer.cs | 18 +---- .../Listxml.Serializer.cs | 14 +--- 16 files changed, 31 insertions(+), 283 deletions(-) delete mode 100644 SabreTools.Data.Models/Metadata/Analog.cs delete mode 100644 SabreTools.Metadata.DatItems/Formats/Analog.cs diff --git a/SabreTools.Data.Extensions.Test/MetadataExtensionsTests.cs b/SabreTools.Data.Extensions.Test/MetadataExtensionsTests.cs index 3301376c..37aeb821 100644 --- a/SabreTools.Data.Extensions.Test/MetadataExtensionsTests.cs +++ b/SabreTools.Data.Extensions.Test/MetadataExtensionsTests.cs @@ -2738,7 +2738,6 @@ namespace SabreTools.Data.Extensions.Test [Theory] [InlineData(null, ItemType.NULL)] [InlineData("adjuster", ItemType.Adjuster)] - [InlineData("analog", ItemType.Analog)] [InlineData("archive", ItemType.Archive)] [InlineData("biosset", ItemType.BiosSet)] [InlineData("blank", ItemType.Blank)] @@ -3138,7 +3137,6 @@ namespace SabreTools.Data.Extensions.Test [Theory] [InlineData(ItemType.NULL, null)] [InlineData(ItemType.Adjuster, "adjuster")] - [InlineData(ItemType.Analog, "analog")] [InlineData(ItemType.Archive, "archive")] [InlineData(ItemType.BiosSet, "biosset")] [InlineData(ItemType.Blank, "blank")] diff --git a/SabreTools.Data.Extensions/MetadataExtensions.cs b/SabreTools.Data.Extensions/MetadataExtensions.cs index 1413f454..d0d83788 100644 --- a/SabreTools.Data.Extensions/MetadataExtensions.cs +++ b/SabreTools.Data.Extensions/MetadataExtensions.cs @@ -905,7 +905,6 @@ namespace SabreTools.Data.Extensions // "Auxiliary" item types "adjuster" => ItemType.Adjuster, - "analog" => ItemType.Analog, "archive" => ItemType.Archive, "biosset" => ItemType.BiosSet, "chip" => ItemType.Chip, @@ -1386,7 +1385,6 @@ namespace SabreTools.Data.Extensions // "Auxiliary" item types ItemType.Adjuster => "adjuster", - ItemType.Analog => "analog", ItemType.Archive => "archive", ItemType.BiosSet => "biosset", ItemType.Chip => "chip", diff --git a/SabreTools.Data.Models/Metadata/Analog.cs b/SabreTools.Data.Models/Metadata/Analog.cs deleted file mode 100644 index c99da0f0..00000000 --- a/SabreTools.Data.Models/Metadata/Analog.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System; -using System.Xml.Serialization; -using Newtonsoft.Json; - -namespace SabreTools.Data.Models.Metadata -{ - [JsonObject("analog"), XmlRoot("analog")] - public class Analog : DatItem, ICloneable, IEquatable - { - #region Properties - - public string? Mask { get; set; } - - #endregion - - public Analog() => ItemType = ItemType.Analog; - - /// - public object Clone() - { - var obj = new Analog(); - - obj.Mask = Mask; - - return obj; - } - - /// - public bool Equals(Analog? other) - { - // Null never matches - if (other is null) - return false; - - // Properties - if ((Mask is null) ^ (other.Mask is null)) - return false; - else if (Mask is not null && !Mask.Equals(other.Mask, StringComparison.OrdinalIgnoreCase)) - return false; - - return true; - } - } -} diff --git a/SabreTools.Data.Models/Metadata/Enums.cs b/SabreTools.Data.Models/Metadata/Enums.cs index b1edf5b4..f52e8c61 100644 --- a/SabreTools.Data.Models/Metadata/Enums.cs +++ b/SabreTools.Data.Models/Metadata/Enums.cs @@ -272,7 +272,6 @@ namespace SabreTools.Data.Models.Metadata NULL = 0, Adjuster, - Analog, Archive, BiosSet, Chip, diff --git a/SabreTools.Data.Models/Metadata/Port.cs b/SabreTools.Data.Models/Metadata/Port.cs index ed9540d5..e4730c71 100644 --- a/SabreTools.Data.Models/Metadata/Port.cs +++ b/SabreTools.Data.Models/Metadata/Port.cs @@ -9,7 +9,7 @@ namespace SabreTools.Data.Models.Metadata { #region Properties - public Analog[]? Analog { get; set; } + public string[]? AnalogMask { get; set; } public string? Tag { get; set; } @@ -22,8 +22,8 @@ namespace SabreTools.Data.Models.Metadata { var obj = new Port(); - if (Analog is not null) - obj.Analog = Array.ConvertAll(Analog, i => (Analog)i.Clone()); + if (AnalogMask is not null) + obj.AnalogMask = Array.ConvertAll(AnalogMask, i => i); obj.Tag = Tag; return obj; diff --git a/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs b/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs index 6dc30380..dfb56612 100644 --- a/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs +++ b/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs @@ -355,14 +355,6 @@ namespace SabreTools.Metadata.DatFiles.Test }; } - private static Data.Models.Metadata.Analog CreateMetadataAnalog() - { - return new Data.Models.Metadata.Analog - { - Mask = "mask", - }; - } - private static Data.Models.Metadata.Archive CreateMetadataArchive() { return new Data.Models.Metadata.Archive @@ -717,7 +709,7 @@ namespace SabreTools.Metadata.DatFiles.Test { return new Data.Models.Metadata.Port { - Analog = [CreateMetadataAnalog()], + AnalogMask = ["mask"], Tag = "tag", }; } @@ -1128,12 +1120,6 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.Equal("name", adjuster.Name); } - private static void ValidateAnalog(Analog? analog) - { - Assert.NotNull(analog); - Assert.Equal("mask", analog.Mask); - } - private static void ValidateArchive(Archive? archive) { Assert.NotNull(archive); @@ -1424,10 +1410,10 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.NotNull(port); Assert.Equal("tag", port.Tag); - Analog[]? dipValues = port.Analog; - Assert.NotNull(dipValues); - Analog? dipValue = Assert.Single(dipValues); - ValidateAnalog(dipValue); + string[]? analogMasks = port.AnalogMask; + Assert.NotNull(analogMasks); + string? analogMask = Assert.Single(analogMasks); + Assert.Equal("mask", analogMask); } private static void ValidateRamOption(RamOption? ramOption) diff --git a/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs b/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs index 129c939e..db6e4987 100644 --- a/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs +++ b/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs @@ -620,12 +620,6 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.Equal("name", adjuster.Name); } - private static void ValidateMetadataAnalog(Data.Models.Metadata.Analog? analog) - { - Assert.NotNull(analog); - Assert.Equal("mask", analog.Mask); - } - private static void ValidateMetadataArchive(Data.Models.Metadata.Archive? archive) { Assert.NotNull(archive); @@ -965,10 +959,10 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.NotNull(port); Assert.Equal("tag", port.Tag); - Data.Models.Metadata.Analog[]? dipValues = port.Analog; - Assert.NotNull(dipValues); - Data.Models.Metadata.Analog? dipValue = Assert.Single(dipValues); - ValidateMetadataAnalog(dipValue); + string[]? analogMasks = port.AnalogMask; + Assert.NotNull(analogMasks); + string? analogMask = Assert.Single(analogMasks); + Assert.Equal("mask", analogMask); } private static void ValidateMetadataRamOption(Data.Models.Metadata.RamOption? ramOption) diff --git a/SabreTools.Metadata.DatFiles/Formats/SabreJSON.cs b/SabreTools.Metadata.DatFiles/Formats/SabreJSON.cs index 6c6d8f08..1292e96e 100644 --- a/SabreTools.Metadata.DatFiles/Formats/SabreJSON.cs +++ b/SabreTools.Metadata.DatFiles/Formats/SabreJSON.cs @@ -258,9 +258,6 @@ namespace SabreTools.Metadata.DatFiles.Formats case Data.Models.Metadata.ItemType.Adjuster: datItem = datItemObj.ToObject(); break; - case Data.Models.Metadata.ItemType.Analog: - datItem = datItemObj.ToObject(); - break; case Data.Models.Metadata.ItemType.Archive: datItem = datItemObj.ToObject(); break; diff --git a/SabreTools.Metadata.DatItems/DatItem.cs b/SabreTools.Metadata.DatItems/DatItem.cs index 9c906391..ed51ad75 100644 --- a/SabreTools.Metadata.DatItems/DatItem.cs +++ b/SabreTools.Metadata.DatItems/DatItem.cs @@ -12,7 +12,6 @@ namespace SabreTools.Metadata.DatItems /// [JsonObject("datitem"), XmlRoot("datitem")] [XmlInclude(typeof(Adjuster))] - [XmlInclude(typeof(Analog))] [XmlInclude(typeof(Archive))] [XmlInclude(typeof(BiosSet))] [XmlInclude(typeof(Blank))] diff --git a/SabreTools.Metadata.DatItems/Formats/Analog.cs b/SabreTools.Metadata.DatItems/Formats/Analog.cs deleted file mode 100644 index df3362ff..00000000 --- a/SabreTools.Metadata.DatItems/Formats/Analog.cs +++ /dev/null @@ -1,80 +0,0 @@ -using System.Xml.Serialization; -using Newtonsoft.Json; - -namespace SabreTools.Metadata.DatItems.Formats -{ - /// - /// Represents a single analog item - /// - [JsonObject("analog"), XmlRoot("analog")] - public sealed class Analog : DatItem - { - #region Properties - - /// /> - public override Data.Models.Metadata.ItemType ItemType - => Data.Models.Metadata.ItemType.Analog; - - public string? Mask - { - get => _internal.Mask; - set => _internal.Mask = value; - } - - #endregion - - #region Constructors - - public Analog() : base() { } - - public Analog(Data.Models.Metadata.Analog item) : base(item) { } - - public Analog(Data.Models.Metadata.Analog item, Machine machine, Source source) : this(item) - { - Source = source; - CopyMachineInformation(machine); - } - - #endregion - - #region Accessors - - /// - public override string? GetName() => null; - - /// - public override void SetName(string? name) { } - - #endregion - - #region Cloning Methods - - /// - public override object Clone() => new Analog(GetInternalClone()); - - /// - public override Data.Models.Metadata.Analog GetInternalClone() - => _internal.Clone() as Data.Models.Metadata.Analog ?? new(); - - #endregion - - #region Comparision Methods - - /// - public override bool Equals(DatItem? other) - { - // If the other item is null - if (other is null) - return false; - - // If the type matches - if (other is Analog otherAnalog) - return _internal.Equals(otherAnalog._internal); - - // Everything else fails - return false; - } - - #endregion - } -} diff --git a/SabreTools.Metadata.DatItems/Formats/Port.cs b/SabreTools.Metadata.DatItems/Formats/Port.cs index a0e6b1a0..0b2c681a 100644 --- a/SabreTools.Metadata.DatItems/Formats/Port.cs +++ b/SabreTools.Metadata.DatItems/Formats/Port.cs @@ -1,7 +1,5 @@ -using System; -using System.Xml.Serialization; +using System.Xml.Serialization; using Newtonsoft.Json; -using SabreTools.Metadata.Filter; namespace SabreTools.Metadata.DatItems.Formats { @@ -13,10 +11,11 @@ namespace SabreTools.Metadata.DatItems.Formats { #region Properties - public Analog[]? Analog { get; set; } - - [JsonIgnore] - public bool AnalogSpecified => Analog is not null && Analog.Length > 0; + public string[]? AnalogMask + { + get => _internal.AnalogMask; + set => _internal.AnalogMask = value; + } /// /> public override Data.Models.Metadata.ItemType ItemType @@ -34,12 +33,7 @@ namespace SabreTools.Metadata.DatItems.Formats public Port() : base() { } - public Port(Data.Models.Metadata.Port item) : base(item) - { - // Handle subitems - if (item.Analog is not null) - Analog = Array.ConvertAll(item.Analog, analog => new Analog(analog)); ; - } + public Port(Data.Models.Metadata.Port item) : base(item) { } public Port(Data.Models.Metadata.Port item, Machine machine, Source source) : this(item) { @@ -66,14 +60,7 @@ namespace SabreTools.Metadata.DatItems.Formats /// public override Data.Models.Metadata.Port GetInternalClone() - { - var portItem = _internal.Clone() as Data.Models.Metadata.Port ?? new(); - - if (Analog is not null) - portItem.Analog = Array.ConvertAll(Analog, analog => analog.GetInternalClone()); - - return portItem; - } + => _internal.Clone() as Data.Models.Metadata.Port ?? new(); #endregion @@ -95,28 +82,5 @@ namespace SabreTools.Metadata.DatItems.Formats } #endregion - - #region Manipulation - - /// - public override bool PassesFilter(FilterRunner filterRunner) - { - if (Machine is not null && !Machine.PassesFilter(filterRunner)) - return false; - - // TODO: Analog - - return filterRunner.Run(_internal); - } - - /// - public override bool PassesFilterDB(FilterRunner filterRunner) - { - // TODO: Analog - - return filterRunner.Run(_internal); - } - - #endregion } } diff --git a/SabreTools.Metadata.Filter.Test/FilterObjectTests.cs b/SabreTools.Metadata.Filter.Test/FilterObjectTests.cs index 811b3a92..117afaac 100644 --- a/SabreTools.Metadata.Filter.Test/FilterObjectTests.cs +++ b/SabreTools.Metadata.Filter.Test/FilterObjectTests.cs @@ -502,24 +502,6 @@ namespace SabreTools.Metadata.Filter.Test #endregion - #region Analog - - [Theory] - [InlineData("analog.mask", "mask")] - public void Matches_Analog(string itemField, string value) - { - var filter = new FilterObject(itemField, value, Operation.Equals); - Analog obj = new Analog - { - Mask = "mask", - }; - - bool actual = filter.Matches(obj); - Assert.True(actual); - } - - #endregion - #region Archive [Theory] @@ -1462,12 +1444,14 @@ namespace SabreTools.Metadata.Filter.Test #region Port [Theory] + // [InlineData("port.analog.mask", "mask")] // TODO: Figure out how to deal with string arrays [InlineData("port.tag", "tag")] public void Matches_Port(string itemField, string value) { var filter = new FilterObject(itemField, value, Operation.Equals); Port obj = new Port { + AnalogMask = ["mask"], Tag = "tag", }; diff --git a/SabreTools.Metadata.Filter/FilterKey.cs b/SabreTools.Metadata.Filter/FilterKey.cs index ad5ae8fe..6b5f3c00 100644 --- a/SabreTools.Metadata.Filter/FilterKey.cs +++ b/SabreTools.Metadata.Filter/FilterKey.cs @@ -48,14 +48,6 @@ namespace SabreTools.Metadata.Filter "name" ]; - /// - /// Known keys for Analog - /// - private static readonly string[] _analogKeys = - [ - "mask" - ]; - /// /// Known keys for Archive /// @@ -509,6 +501,7 @@ namespace SabreTools.Metadata.Filter /// private static readonly string[] _portKeys = [ + "analog.mask", "tag", ]; @@ -1006,7 +999,6 @@ namespace SabreTools.Metadata.Filter string[]? properties = itemName.ToLowerInvariant() switch { "adjuster" => _adjusterKeys, - "analog" => _analogKeys, "archive" => _archiveKeys, "biosset" => _biossetKeys, "chip" => _chipKeys, diff --git a/SabreTools.Metadata.Filter/FilterObject.cs b/SabreTools.Metadata.Filter/FilterObject.cs index eaa7d745..a62106f4 100644 --- a/SabreTools.Metadata.Filter/FilterObject.cs +++ b/SabreTools.Metadata.Filter/FilterObject.cs @@ -379,7 +379,6 @@ namespace SabreTools.Metadata.Filter switch (obj) { case Adjuster item: return GetCheckValue(item, fieldName, out checkValue); - case Analog item: return GetCheckValue(item, fieldName, out checkValue); case Archive item: return GetCheckValue(item, fieldName, out checkValue); case BiosSet item: return GetCheckValue(item, fieldName, out checkValue); case Chip item: return GetCheckValue(item, fieldName, out checkValue); @@ -531,24 +530,6 @@ namespace SabreTools.Metadata.Filter } } - /// - /// Get the check value for a field - /// - private static bool GetCheckValue(Analog obj, string fieldName, out string? checkValue) - { - switch (fieldName) - { - case "mask": - checkValue = obj.Mask; - return true; - - // If the key doesn't exist, we count it as null - default: - checkValue = null; - return false; - } - } - /// /// Get the check value for a field /// @@ -1739,6 +1720,10 @@ namespace SabreTools.Metadata.Filter { switch (fieldName) { + // TODO: Figure out how to deal with string arrays + // case "analog.mask": + // checkValue = obj.AnalogMask; + // return true; case "tag": checkValue = obj.Tag; return true; diff --git a/SabreTools.Serialization.CrossModel/Listxml.Deserializer.cs b/SabreTools.Serialization.CrossModel/Listxml.Deserializer.cs index 7e43d85f..2cbd95e7 100644 --- a/SabreTools.Serialization.CrossModel/Listxml.Deserializer.cs +++ b/SabreTools.Serialization.CrossModel/Listxml.Deserializer.cs @@ -169,18 +169,6 @@ namespace SabreTools.Serialization.CrossModel return adjuster; } - /// - /// Convert from to - /// - private static Analog ConvertFromInternalModel(Data.Models.Metadata.Analog item) - { - var analog = new Analog - { - Mask = item.Mask, - }; - return analog; - } - /// /// Convert from to /// @@ -550,9 +538,9 @@ namespace SabreTools.Serialization.CrossModel Tag = item.Tag, }; - var analogs = item.Analog; - if (analogs is not null && analogs.Length > 0) - port.Analog = Array.ConvertAll(analogs, ConvertFromInternalModel); + var analogMasks = item.AnalogMask; + if (analogMasks is not null && analogMasks.Length > 0) + port.Analog = Array.ConvertAll(analogMasks, analogMask => new Analog { Mask = analogMask }); return port; } diff --git a/SabreTools.Serialization.CrossModel/Listxml.Serializer.cs b/SabreTools.Serialization.CrossModel/Listxml.Serializer.cs index 243d53c1..71f50f05 100644 --- a/SabreTools.Serialization.CrossModel/Listxml.Serializer.cs +++ b/SabreTools.Serialization.CrossModel/Listxml.Serializer.cs @@ -139,18 +139,6 @@ namespace SabreTools.Serialization.CrossModel return adjuster; } - /// - /// Convert from to - /// - private static Data.Models.Metadata.Analog ConvertToInternalModel(Analog item) - { - var analog = new Data.Models.Metadata.Analog - { - Mask = item.Mask, - }; - return analog; - } - /// /// Convert from to /// @@ -467,7 +455,7 @@ namespace SabreTools.Serialization.CrossModel }; if (item.Analog is not null && item.Analog.Length > 0) - port.Analog = Array.ConvertAll(item.Analog, ConvertToInternalModel); + port.AnalogMask = Array.ConvertAll(item.Analog, analog => analog.Mask ?? string.Empty); return port; }