Flatten Analog out of existence

This commit is contained in:
Matt Nadareski
2026-04-09 22:21:15 -04:00
parent 853e2ff5c0
commit ca3ebf33a8
16 changed files with 31 additions and 283 deletions

View File

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

View File

@@ -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",

View File

@@ -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<Analog>
{
#region Properties
public string? Mask { get; set; }
#endregion
public Analog() => ItemType = ItemType.Analog;
/// <inheritdoc/>
public object Clone()
{
var obj = new Analog();
obj.Mask = Mask;
return obj;
}
/// <inheritdoc/>
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;
}
}
}

View File

@@ -272,7 +272,6 @@ namespace SabreTools.Data.Models.Metadata
NULL = 0,
Adjuster,
Analog,
Archive,
BiosSet,
Chip,

View File

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

View File

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

View File

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

View File

@@ -258,9 +258,6 @@ namespace SabreTools.Metadata.DatFiles.Formats
case Data.Models.Metadata.ItemType.Adjuster:
datItem = datItemObj.ToObject<Adjuster>();
break;
case Data.Models.Metadata.ItemType.Analog:
datItem = datItemObj.ToObject<Analog>();
break;
case Data.Models.Metadata.ItemType.Archive:
datItem = datItemObj.ToObject<Archive>();
break;

View File

@@ -12,7 +12,6 @@ namespace SabreTools.Metadata.DatItems
/// </summary>
[JsonObject("datitem"), XmlRoot("datitem")]
[XmlInclude(typeof(Adjuster))]
[XmlInclude(typeof(Analog))]
[XmlInclude(typeof(Archive))]
[XmlInclude(typeof(BiosSet))]
[XmlInclude(typeof(Blank))]

View File

@@ -1,80 +0,0 @@
using System.Xml.Serialization;
using Newtonsoft.Json;
namespace SabreTools.Metadata.DatItems.Formats
{
/// <summary>
/// Represents a single analog item
/// </summary>
[JsonObject("analog"), XmlRoot("analog")]
public sealed class Analog : DatItem<Data.Models.Metadata.Analog>
{
#region Properties
/// <inheritdoc>/>
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
/// <inheritdoc/>
public override string? GetName() => null;
/// <inheritdoc/>
public override void SetName(string? name) { }
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone() => new Analog(GetInternalClone());
/// <inheritdoc/>
public override Data.Models.Metadata.Analog GetInternalClone()
=> _internal.Clone() as Data.Models.Metadata.Analog ?? new();
#endregion
#region Comparision Methods
/// <inheritdoc/>
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
}
}

View File

@@ -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;
}
/// <inheritdoc>/>
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
/// <inheritdoc/>
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
/// <inheritdoc/>
public override bool PassesFilter(FilterRunner filterRunner)
{
if (Machine is not null && !Machine.PassesFilter(filterRunner))
return false;
// TODO: Analog
return filterRunner.Run(_internal);
}
/// <inheritdoc/>
public override bool PassesFilterDB(FilterRunner filterRunner)
{
// TODO: Analog
return filterRunner.Run(_internal);
}
#endregion
}
}

View File

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

View File

@@ -48,14 +48,6 @@ namespace SabreTools.Metadata.Filter
"name"
];
/// <summary>
/// Known keys for Analog
/// </summary>
private static readonly string[] _analogKeys =
[
"mask"
];
/// <summary>
/// Known keys for Archive
/// </summary>
@@ -509,6 +501,7 @@ namespace SabreTools.Metadata.Filter
/// </summary>
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,

View File

@@ -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
}
}
/// <summary>
/// Get the check value for a field
/// </summary>
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;
}
}
/// <summary>
/// Get the check value for a field
/// </summary>
@@ -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;

View File

@@ -169,18 +169,6 @@ namespace SabreTools.Serialization.CrossModel
return adjuster;
}
/// <summary>
/// Convert from <see cref="Models.Metadata.Analog"/> to <see cref="Analog"/>
/// </summary>
private static Analog ConvertFromInternalModel(Data.Models.Metadata.Analog item)
{
var analog = new Analog
{
Mask = item.Mask,
};
return analog;
}
/// <summary>
/// Convert from <see cref="Models.Metadata.BiosSet"/> to <see cref="BiosSet"/>
/// </summary>
@@ -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;
}

View File

@@ -139,18 +139,6 @@ namespace SabreTools.Serialization.CrossModel
return adjuster;
}
/// <summary>
/// Convert from <see cref="Analog"/> to <see cref="Models.Metadata.Analog"/>
/// </summary>
private static Data.Models.Metadata.Analog ConvertToInternalModel(Analog item)
{
var analog = new Data.Models.Metadata.Analog
{
Mask = item.Mask,
};
return analog;
}
/// <summary>
/// Convert from <see cref="BiosSet"/> to <see cref="Models.Metadata.BiosSet"/>
/// </summary>
@@ -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;
}