From 4bb670ac152ddced6f07503ba848d8d548eaa502 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Sat, 4 Apr 2026 01:36:42 -0400 Subject: [PATCH] Convert Port fully over to properties --- .../MetadataExtensions.cs | 6 +-- SabreTools.Data.Models/Metadata/Port.cs | 44 +++++++++++++++---- .../DatFileTests.FromMetadata.cs | 4 +- .../DatFileTests.ToMetadata.cs | 2 +- SabreTools.Metadata.DatItems/Formats/Port.cs | 27 +++--------- .../DictionaryBaseExtensions.cs | 2 +- .../Listxml.Deserializer.cs | 2 +- .../Listxml.Serializer.cs | 5 +-- 8 files changed, 50 insertions(+), 42 deletions(-) diff --git a/SabreTools.Data.Extensions/MetadataExtensions.cs b/SabreTools.Data.Extensions/MetadataExtensions.cs index 8bd06c05..a5740844 100644 --- a/SabreTools.Data.Extensions/MetadataExtensions.cs +++ b/SabreTools.Data.Extensions/MetadataExtensions.cs @@ -194,6 +194,8 @@ namespace SabreTools.Data.Extensions return media.Clone() as Media; else if (self is Original original) return original.Clone() as Original; + else if (self is Port port) + return port.Clone() as Port; else if (self is RamOption ramOption) return ramOption.Clone() as RamOption; else if (self is Release release) @@ -331,10 +333,6 @@ namespace SabreTools.Data.Extensions { clonePart.Interface = selfPart.Interface; } - else if (self is Port selfPort && clone is Port clonePort) - { - clonePort.Tag = selfPort.Tag; - } else if (self is Rom selfRom && clone is Rom cloneRom) { cloneRom.Dispose = selfRom.Dispose; diff --git a/SabreTools.Data.Models/Metadata/Port.cs b/SabreTools.Data.Models/Metadata/Port.cs index 16c586ec..ed9540d5 100644 --- a/SabreTools.Data.Models/Metadata/Port.cs +++ b/SabreTools.Data.Models/Metadata/Port.cs @@ -1,25 +1,51 @@ +using System; using System.Xml.Serialization; using Newtonsoft.Json; namespace SabreTools.Data.Models.Metadata { [JsonObject("port"), XmlRoot("port")] - public class Port : DatItem + public class Port : DatItem, ICloneable, IEquatable { #region Properties + public Analog[]? Analog { get; set; } + public string? Tag { get; set; } #endregion - #region Keys - - /// Analog[] - [NoFilter] - public const string AnalogKey = "analog"; - - #endregion - public Port() => ItemType = ItemType.Port; + + /// + public object Clone() + { + var obj = new Port(); + + if (Analog is not null) + obj.Analog = Array.ConvertAll(Analog, i => (Analog)i.Clone()); + obj.Tag = Tag; + + return obj; + } + + /// + public bool Equals(Port? other) + { + // Null never matches + if (other is null) + return false; + + // Properties + if ((Tag is null) ^ (other.Tag is null)) + return false; + else if (Tag is not null && !Tag.Equals(other.Tag, StringComparison.OrdinalIgnoreCase)) + return false; + + // Sub-items + // TODO: Figure out how to properly check arrays + + return true; + } } } diff --git a/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs b/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs index 637cd8b9..e6eb1785 100644 --- a/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs +++ b/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs @@ -717,7 +717,7 @@ namespace SabreTools.Metadata.DatFiles.Test { return new Data.Models.Metadata.Port { - [Data.Models.Metadata.Port.AnalogKey] = new Data.Models.Metadata.Analog[] { CreateMetadataAnalog() }, + Analog = [CreateMetadataAnalog()], Tag = "tag", }; } @@ -1441,7 +1441,7 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.NotNull(port); Assert.Equal("tag", port.Tag); - Analog[]? dipValues = port.Read(Data.Models.Metadata.Port.AnalogKey); + Analog[]? dipValues = port.Analog; Assert.NotNull(dipValues); Analog? dipValue = Assert.Single(dipValues); ValidateAnalog(dipValue); diff --git a/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs b/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs index 3681e4a5..16cbd3b4 100644 --- a/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs +++ b/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs @@ -985,7 +985,7 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.NotNull(port); Assert.Equal("tag", port.Tag); - Data.Models.Metadata.Analog[]? dipValues = port.ReadArray(Data.Models.Metadata.Port.AnalogKey); + Data.Models.Metadata.Analog[]? dipValues = port.Analog; Assert.NotNull(dipValues); Data.Models.Metadata.Analog? dipValue = Assert.Single(dipValues); ValidateMetadataAnalog(dipValue); diff --git a/SabreTools.Metadata.DatItems/Formats/Port.cs b/SabreTools.Metadata.DatItems/Formats/Port.cs index eb19965f..c3c9b65c 100644 --- a/SabreTools.Metadata.DatItems/Formats/Port.cs +++ b/SabreTools.Metadata.DatItems/Formats/Port.cs @@ -13,15 +13,10 @@ namespace SabreTools.Metadata.DatItems.Formats { #region Fields + public Analog[]? Analog { get; set; } + [JsonIgnore] - public bool AnalogsSpecified - { - get - { - var analogs = Read(Data.Models.Metadata.Port.AnalogKey); - return analogs is not null && analogs.Length > 0; - } - } + public bool AnalogSpecified => Analog is not null && Analog.Length > 0; /// /> public override Data.Models.Metadata.ItemType ItemType @@ -42,12 +37,8 @@ namespace SabreTools.Metadata.DatItems.Formats public Port(Data.Models.Metadata.Port item) : base(item) { // Handle subitems - var analogs = item.ReadArray(Data.Models.Metadata.Port.AnalogKey); - if (analogs is not null) - { - Analog[] analogItems = Array.ConvertAll(analogs, analog => new Analog(analog)); - Write(Data.Models.Metadata.Port.AnalogKey, analogItems); - } + if (item.Analog is not null) + Analog = Array.ConvertAll(item.Analog, analog => new Analog(analog)); ; } public Port(Data.Models.Metadata.Port item, Machine machine, Source source) : this(item) @@ -68,12 +59,8 @@ namespace SabreTools.Metadata.DatItems.Formats { var portItem = base.GetInternalClone(); - var analogs = Read(Data.Models.Metadata.Port.AnalogKey); - if (analogs is not null) - { - Data.Models.Metadata.Analog[] analogItems = Array.ConvertAll(analogs, analog => analog.GetInternalClone()); - portItem[Data.Models.Metadata.Port.AnalogKey] = analogItems; - } + if (Analog is not null) + portItem.Analog = Array.ConvertAll(Analog, analog => analog.GetInternalClone()); return portItem; } diff --git a/SabreTools.Metadata/DictionaryBaseExtensions.cs b/SabreTools.Metadata/DictionaryBaseExtensions.cs index 1b586053..97fbcfc1 100644 --- a/SabreTools.Metadata/DictionaryBaseExtensions.cs +++ b/SabreTools.Metadata/DictionaryBaseExtensions.cs @@ -361,7 +361,7 @@ namespace SabreTools.Metadata } else if (self is Port selfPort && other is Port otherPort) { - if (selfPort.Tag != otherPort.Tag) + if (!selfPort.Equals(otherPort)) return false; } else if (self is RamOption selfRamOption && other is RamOption otherRamOption) diff --git a/SabreTools.Serialization.CrossModel/Listxml.Deserializer.cs b/SabreTools.Serialization.CrossModel/Listxml.Deserializer.cs index b3187d51..63742f1a 100644 --- a/SabreTools.Serialization.CrossModel/Listxml.Deserializer.cs +++ b/SabreTools.Serialization.CrossModel/Listxml.Deserializer.cs @@ -534,7 +534,7 @@ namespace SabreTools.Serialization.CrossModel Tag = item.Tag, }; - var analogs = item.Read(Data.Models.Metadata.Port.AnalogKey); + var analogs = item.Analog; if (analogs is not null && analogs.Length > 0) port.Analog = Array.ConvertAll(analogs, ConvertFromInternalModel); diff --git a/SabreTools.Serialization.CrossModel/Listxml.Serializer.cs b/SabreTools.Serialization.CrossModel/Listxml.Serializer.cs index b69ce6bb..7631b322 100644 --- a/SabreTools.Serialization.CrossModel/Listxml.Serializer.cs +++ b/SabreTools.Serialization.CrossModel/Listxml.Serializer.cs @@ -557,10 +557,7 @@ namespace SabreTools.Serialization.CrossModel }; if (item.Analog is not null && item.Analog.Length > 0) - { - port[Data.Models.Metadata.Port.AnalogKey] - = Array.ConvertAll(item.Analog, ConvertToInternalModel); - } + port.Analog = Array.ConvertAll(item.Analog, ConvertToInternalModel); return port; }