Convert Port fully over to properties

This commit is contained in:
Matt Nadareski
2026-04-04 01:36:42 -04:00
parent 9e721c5c43
commit 4bb670ac15
8 changed files with 50 additions and 42 deletions

View File

@@ -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;

View File

@@ -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<Port>
{
#region Properties
public Analog[]? Analog { get; set; }
public string? Tag { get; set; }
#endregion
#region Keys
/// <remarks>Analog[]</remarks>
[NoFilter]
public const string AnalogKey = "analog";
#endregion
public Port() => ItemType = ItemType.Port;
/// <inheritdoc/>
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;
}
/// <inheritdoc/>
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;
}
}
}

View File

@@ -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<Analog[]>(Data.Models.Metadata.Port.AnalogKey);
Analog[]? dipValues = port.Analog;
Assert.NotNull(dipValues);
Analog? dipValue = Assert.Single(dipValues);
ValidateAnalog(dipValue);

View File

@@ -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.Analog>(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);

View File

@@ -13,15 +13,10 @@ namespace SabreTools.Metadata.DatItems.Formats
{
#region Fields
public Analog[]? Analog { get; set; }
[JsonIgnore]
public bool AnalogsSpecified
{
get
{
var analogs = Read<Analog[]?>(Data.Models.Metadata.Port.AnalogKey);
return analogs is not null && analogs.Length > 0;
}
}
public bool AnalogSpecified => Analog is not null && Analog.Length > 0;
/// <inheritdoc>/>
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.Analog>(Data.Models.Metadata.Port.AnalogKey);
if (analogs is not null)
{
Analog[] analogItems = Array.ConvertAll(analogs, analog => new Analog(analog));
Write<Analog[]?>(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<Analog[]?>(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;
}

View File

@@ -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)

View File

@@ -534,7 +534,7 @@ namespace SabreTools.Serialization.CrossModel
Tag = item.Tag,
};
var analogs = item.Read<Data.Models.Metadata.Analog[]>(Data.Models.Metadata.Port.AnalogKey);
var analogs = item.Analog;
if (analogs is not null && analogs.Length > 0)
port.Analog = Array.ConvertAll(analogs, ConvertFromInternalModel);

View File

@@ -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;
}