From 9df08780db9f2275b1fdd9105872c4b823ddb999 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Fri, 3 Apr 2026 17:41:36 -0400 Subject: [PATCH] Handle an enum that needed to be handled --- .../MetadataExtensionsTests.cs | 28 +++++++++++++++ .../MetadataExtensions.cs | 35 +++++++++++++++++++ SabreTools.Data.Models/Metadata/DataArea.cs | 7 ++-- SabreTools.Data.Models/Metadata/Enums.cs | 18 ++++++++++ .../SoftwareList/DataArea.cs | 2 +- .../DatFileTests.FromMetadata.cs | 4 +-- .../DatFileTests.ToMetadata.cs | 2 +- .../DatFile.ToMetadata.cs | 4 +-- .../Formats/DataArea.cs | 14 ++++---- SabreTools.Metadata.DatItems/Formats/Rom.cs | 2 +- SabreTools.Metadata.Filter/FilterObject.cs | 3 ++ .../DictionaryBaseExtensions.cs | 2 ++ .../SoftwareListTests.cs | 4 +-- .../SoftwareList.Deserializer.cs | 2 +- .../SoftwareList.Serializer.cs | 2 +- .../SoftwareListTests.cs | 4 +-- .../SoftwareList.cs | 2 +- .../SoftwareList.cs | 2 +- 18 files changed, 111 insertions(+), 26 deletions(-) diff --git a/SabreTools.Data.Extensions.Test/MetadataExtensionsTests.cs b/SabreTools.Data.Extensions.Test/MetadataExtensionsTests.cs index c706f3c1..df1984f8 100644 --- a/SabreTools.Data.Extensions.Test/MetadataExtensionsTests.cs +++ b/SabreTools.Data.Extensions.Test/MetadataExtensionsTests.cs @@ -1879,6 +1879,22 @@ namespace SabreTools.Data.Extensions.Test Assert.Equal(expected, actual); } + [Theory] + [InlineData(null, null)] + [InlineData("8", Width.Byte)] + [InlineData("byte", Width.Byte)] + [InlineData("16", Width.Short)] + [InlineData("short", Width.Short)] + [InlineData("32", Width.Int)] + [InlineData("int", Width.Int)] + [InlineData("64", Width.Long)] + [InlineData("long", Width.Long)] + public void AsWidth(string? field, Width? expected) + { + Width? actual = field.AsWidth(); + Assert.Equal(expected, actual); + } + [Theory] [InlineData(null, null)] [InlineData("INVALID", null)] @@ -2205,6 +2221,18 @@ namespace SabreTools.Data.Extensions.Test Assert.Equal(expected, actual); } + [Theory] + [InlineData((Width)int.MaxValue, null)] + [InlineData(Width.Byte, "8")] + [InlineData(Width.Short, "16")] + [InlineData(Width.Int, "32")] + [InlineData(Width.Long, "64")] + public void FromWidthTest(Width field, string? expected) + { + string? actual = field.AsStringValue(); + Assert.Equal(expected, actual); + } + [Theory] [InlineData(null, null)] [InlineData(true, "yes")] diff --git a/SabreTools.Data.Extensions/MetadataExtensions.cs b/SabreTools.Data.Extensions/MetadataExtensions.cs index 96a982a9..45f790ab 100644 --- a/SabreTools.Data.Extensions/MetadataExtensions.cs +++ b/SabreTools.Data.Extensions/MetadataExtensions.cs @@ -218,6 +218,7 @@ namespace SabreTools.Data.Extensions { cloneDataArea.Endianness = selfDataArea.Endianness; cloneDataArea.Size = selfDataArea.Size; + cloneDataArea.Width = selfDataArea.Width; } else if (self is Device selfDevice && clone is Device cloneDevice) { @@ -1448,6 +1449,23 @@ namespace SabreTools.Data.Extensions }; } + /// + /// Get the enum value for an input string, if possible + /// + /// String value to parse/param> + /// Enum value representing the input, null on error + public static Width? AsWidth(this string? value) + { + return value?.ToLowerInvariant() switch + { + "8" or "byte" => Width.Byte, + "16" or "short" => Width.Short, + "32" or "int" => Width.Int, + "64" or "long" => Width.Long, + _ => null, + }; + } + /// /// Get bool? value from input string /// @@ -1839,6 +1857,23 @@ namespace SabreTools.Data.Extensions }; } + /// + /// Get the string value for an input enum, if possible + /// + /// Enum value to parse/param> + /// String value representing the input, null on error + public static string? AsStringValue(this Width value) + { + return value switch + { + Width.Byte =>"8", + Width.Short =>"16", + Width.Int =>"32", + Width.Long =>"64", + _ => null, + }; + } + /// /// Get the string value for an input enum, if possible /// diff --git a/SabreTools.Data.Models/Metadata/DataArea.cs b/SabreTools.Data.Models/Metadata/DataArea.cs index 9ca44103..be3f714c 100644 --- a/SabreTools.Data.Models/Metadata/DataArea.cs +++ b/SabreTools.Data.Models/Metadata/DataArea.cs @@ -15,6 +15,9 @@ namespace SabreTools.Data.Models.Metadata public long? Size { get; set; } + /// (8|16|32|64) "8" + public Width? Width { get; set; } + #endregion #region Keys @@ -23,10 +26,6 @@ namespace SabreTools.Data.Models.Metadata [NoFilter] public const string RomKey = "rom"; - /// (8|16|32|64) "8" - /// TODO: Convert to enum - public const string WidthKey = "width"; - #endregion public DataArea() => ItemType = ItemType.DataArea; diff --git a/SabreTools.Data.Models/Metadata/Enums.cs b/SabreTools.Data.Models/Metadata/Enums.cs index aaa2e679..bf01b1cf 100644 --- a/SabreTools.Data.Models/Metadata/Enums.cs +++ b/SabreTools.Data.Models/Metadata/Enums.cs @@ -574,4 +574,22 @@ namespace SabreTools.Data.Models.Metadata /// "test" Test, } + + /// + /// Determine area width + /// + public enum Width + { + /// 8 + Byte = 8, + + /// 16 + Short = 16, + + /// 32 + Int = 32, + + /// 64 + Long = 64, + } } diff --git a/SabreTools.Data.Models/SoftwareList/DataArea.cs b/SabreTools.Data.Models/SoftwareList/DataArea.cs index 58cf3219..0d309aa9 100644 --- a/SabreTools.Data.Models/SoftwareList/DataArea.cs +++ b/SabreTools.Data.Models/SoftwareList/DataArea.cs @@ -17,7 +17,7 @@ namespace SabreTools.Data.Models.SoftwareList /// (8|16|32|64) "8" [XmlAttribute("width")] - public string? Width { get; set; } + public Width? Width { get; set; } /// (big|little) "little" [XmlAttribute("endianness")] diff --git a/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs b/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs index 32671ad9..03031399 100644 --- a/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs +++ b/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs @@ -543,7 +543,7 @@ namespace SabreTools.Metadata.DatFiles.Test Name = "name", [Data.Models.Metadata.DataArea.RomKey] = new Data.Models.Metadata.Rom[] { [] }, Size = 12345, - [Data.Models.Metadata.DataArea.WidthKey] = 64, + Width = Data.Models.Metadata.Width.Long, }; } @@ -1236,7 +1236,7 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.Equal(Data.Models.Metadata.Endianness.Big, dataArea.Endianness); Assert.Equal("name", dataArea.Name); Assert.Equal(12345, dataArea.Size); - Assert.Equal(64, dataArea.ReadLong(Data.Models.Metadata.DataArea.WidthKey)); + Assert.Equal(Data.Models.Metadata.Width.Long, dataArea.Width); } private static void ValidateDevice(Device? device) diff --git a/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs b/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs index 3cb740ac..d31360ab 100644 --- a/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs +++ b/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs @@ -761,7 +761,7 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.Equal(Data.Models.Metadata.Endianness.Big, dataArea.Endianness); Assert.Equal("name", dataArea.Name); Assert.Equal(12345, dataArea.Size); - Assert.Equal(64, dataArea.ReadLong(Data.Models.Metadata.DataArea.WidthKey)); + Assert.Equal(Data.Models.Metadata.Width.Long, dataArea.Width); Data.Models.Metadata.Rom[]? roms = dataArea.ReadArray(Data.Models.Metadata.DataArea.RomKey); Assert.NotNull(roms); diff --git a/SabreTools.Metadata.DatFiles/DatFile.ToMetadata.cs b/SabreTools.Metadata.DatFiles/DatFile.ToMetadata.cs index 4d27a5fa..a1ab021f 100644 --- a/SabreTools.Metadata.DatFiles/DatFile.ToMetadata.cs +++ b/SabreTools.Metadata.DatFiles/DatFile.ToMetadata.cs @@ -360,7 +360,7 @@ namespace SabreTools.Metadata.DatFiles aggregateDataArea.Endianness = dataArea.Endianness; aggregateDataArea.Name = dataArea.Name; aggregateDataArea.Size = dataArea.Size; - aggregateDataArea[Data.Models.Metadata.DataArea.WidthKey] = dataArea.ReadString(Data.Models.Metadata.DataArea.WidthKey); + aggregateDataArea.Width = dataArea.Width; } // Clear any empty fields @@ -786,7 +786,7 @@ namespace SabreTools.Metadata.DatFiles aggregateDataArea.Endianness = dataArea.Endianness; aggregateDataArea.Name = dataArea.Name; aggregateDataArea.Size = dataArea.Size; - aggregateDataArea[Data.Models.Metadata.DataArea.WidthKey] = dataArea.ReadString(Data.Models.Metadata.DataArea.WidthKey); + aggregateDataArea.Width = dataArea.Width; } // Clear any empty fields diff --git a/SabreTools.Metadata.DatItems/Formats/DataArea.cs b/SabreTools.Metadata.DatItems/Formats/DataArea.cs index 5bbb67ee..f29196ae 100644 --- a/SabreTools.Metadata.DatItems/Formats/DataArea.cs +++ b/SabreTools.Metadata.DatItems/Formats/DataArea.cs @@ -35,19 +35,19 @@ namespace SabreTools.Metadata.DatItems.Formats set => (_internal as Data.Models.Metadata.DataArea)?.Size = value; } + public Data.Models.Metadata.Width? Width + { + get => (_internal as Data.Models.Metadata.DataArea)?.Width; + set => (_internal as Data.Models.Metadata.DataArea)?.Width = value; + } + #endregion #region Constructors public DataArea() : base() { } - public DataArea(Data.Models.Metadata.DataArea item) : base(item) - { - // Process flag values - long? width = ReadLong(Data.Models.Metadata.DataArea.WidthKey); - if (width is not null) - Write(Data.Models.Metadata.DataArea.WidthKey, width.ToString()); - } + public DataArea(Data.Models.Metadata.DataArea item) : base(item) { } public DataArea(Data.Models.Metadata.DataArea item, Machine machine, Source source) : this(item) { diff --git a/SabreTools.Metadata.DatItems/Formats/Rom.cs b/SabreTools.Metadata.DatItems/Formats/Rom.cs index b84929ed..3a19d3c9 100644 --- a/SabreTools.Metadata.DatItems/Formats/Rom.cs +++ b/SabreTools.Metadata.DatItems/Formats/Rom.cs @@ -37,7 +37,7 @@ namespace SabreTools.Metadata.DatItems.Formats return dataArea is not null && (!string.IsNullOrEmpty(dataArea.Name) || dataArea.Size is not null - || dataArea.ReadLong(Data.Models.Metadata.DataArea.WidthKey) is not null + || dataArea.Width is not null || dataArea.Endianness is not null); } } diff --git a/SabreTools.Metadata.Filter/FilterObject.cs b/SabreTools.Metadata.Filter/FilterObject.cs index 4f62a17d..73671a19 100644 --- a/SabreTools.Metadata.Filter/FilterObject.cs +++ b/SabreTools.Metadata.Filter/FilterObject.cs @@ -460,6 +460,9 @@ namespace SabreTools.Metadata.Filter case DataArea item when fieldName == "size": checkValue = item.Size?.ToString(); return true; + case DataArea item when fieldName == "width": + checkValue = item.Width?.AsStringValue(); + return true; case Device item when fieldName == "type": checkValue = item.DeviceType?.AsStringValue(); diff --git a/SabreTools.Metadata/DictionaryBaseExtensions.cs b/SabreTools.Metadata/DictionaryBaseExtensions.cs index 1587ddf2..6c78aa89 100644 --- a/SabreTools.Metadata/DictionaryBaseExtensions.cs +++ b/SabreTools.Metadata/DictionaryBaseExtensions.cs @@ -122,6 +122,8 @@ namespace SabreTools.Metadata return false; if (selfDataArea.Size != otherDataArea.Size) return false; + if (selfDataArea.Width != otherDataArea.Width) + return false; } else if (self is Device selfDevice && other is Device otherDevice) { diff --git a/SabreTools.Serialization.CrossModel.Test/SoftwareListTests.cs b/SabreTools.Serialization.CrossModel.Test/SoftwareListTests.cs index 5b4a7beb..2ca08e6b 100644 --- a/SabreTools.Serialization.CrossModel.Test/SoftwareListTests.cs +++ b/SabreTools.Serialization.CrossModel.Test/SoftwareListTests.cs @@ -71,7 +71,7 @@ namespace SabreTools.Serialization.CrossModel.Test { Name = "name", Size = 12345, - Width = "XXXXXX", + Width = Data.Models.Metadata.Width.Long, Endianness = Data.Models.Metadata.Endianness.Big, Rom = [rom], }; @@ -230,7 +230,7 @@ namespace SabreTools.Serialization.CrossModel.Test Assert.NotNull(dataarea); Assert.Equal("name", dataarea.Name); Assert.Equal(12345, dataarea.Size); - Assert.Equal("XXXXXX", dataarea.Width); + Assert.Equal(Data.Models.Metadata.Width.Long, dataarea.Width); Assert.Equal(Data.Models.Metadata.Endianness.Big, dataarea.Endianness); Assert.NotNull(dataarea.Rom); diff --git a/SabreTools.Serialization.CrossModel/SoftwareList.Deserializer.cs b/SabreTools.Serialization.CrossModel/SoftwareList.Deserializer.cs index 72d4ac87..9ba57d49 100644 --- a/SabreTools.Serialization.CrossModel/SoftwareList.Deserializer.cs +++ b/SabreTools.Serialization.CrossModel/SoftwareList.Deserializer.cs @@ -75,7 +75,7 @@ namespace SabreTools.Serialization.CrossModel { Name = item.Name, Size = item.Size, - Width = item.ReadString(Data.Models.Metadata.DataArea.WidthKey), + Width = item.Width, Endianness = item.Endianness, }; diff --git a/SabreTools.Serialization.CrossModel/SoftwareList.Serializer.cs b/SabreTools.Serialization.CrossModel/SoftwareList.Serializer.cs index 155b9125..21665b23 100644 --- a/SabreTools.Serialization.CrossModel/SoftwareList.Serializer.cs +++ b/SabreTools.Serialization.CrossModel/SoftwareList.Serializer.cs @@ -76,7 +76,7 @@ namespace SabreTools.Serialization.CrossModel { Name = item.Name, Size = item.Size, - [Data.Models.Metadata.DataArea.WidthKey] = item.Width, + Width = item.Width, Endianness = item.Endianness, }; diff --git a/SabreTools.Serialization.Readers.Test/SoftwareListTests.cs b/SabreTools.Serialization.Readers.Test/SoftwareListTests.cs index 7473572c..bb81460f 100644 --- a/SabreTools.Serialization.Readers.Test/SoftwareListTests.cs +++ b/SabreTools.Serialization.Readers.Test/SoftwareListTests.cs @@ -144,7 +144,7 @@ namespace SabreTools.Serialization.Readers.Test { Name = "name", Size = 12345, - Width = "XXXXXX", + Width = Data.Models.Metadata.Width.Long, Endianness = Data.Models.Metadata.Endianness.Big, Rom = [rom], }; @@ -303,7 +303,7 @@ namespace SabreTools.Serialization.Readers.Test Assert.NotNull(dataarea); Assert.Equal("name", dataarea.Name); Assert.Equal(12345, dataarea.Size); - Assert.Equal("XXXXXX", dataarea.Width); + Assert.Equal(Data.Models.Metadata.Width.Long, dataarea.Width); Assert.Equal(Data.Models.Metadata.Endianness.Big, dataarea.Endianness); Assert.NotNull(dataarea.Rom); diff --git a/SabreTools.Serialization.Readers/SoftwareList.cs b/SabreTools.Serialization.Readers/SoftwareList.cs index f79c12bb..e139967e 100644 --- a/SabreTools.Serialization.Readers/SoftwareList.cs +++ b/SabreTools.Serialization.Readers/SoftwareList.cs @@ -127,7 +127,7 @@ namespace SabreTools.Serialization.Readers obj.Name = reader.GetAttribute("name"); obj.Size = NumberHelper.ConvertToInt64(reader.GetAttribute("size")); - obj.Width = reader.GetAttribute("width"); + obj.Width = reader.GetAttribute("width").AsWidth(); obj.Endianness = reader.GetAttribute("endianness").AsEndianness(); List roms = []; diff --git a/SabreTools.Serialization.Writers/SoftwareList.cs b/SabreTools.Serialization.Writers/SoftwareList.cs index 7c4e3bc4..14eab739 100644 --- a/SabreTools.Serialization.Writers/SoftwareList.cs +++ b/SabreTools.Serialization.Writers/SoftwareList.cs @@ -105,7 +105,7 @@ namespace SabreTools.Serialization.Writers writer.WriteRequiredAttributeString("name", obj.Name); writer.WriteRequiredAttributeString("size", obj.Size?.ToString()); - writer.WriteOptionalAttributeString("width", obj.Width); + writer.WriteOptionalAttributeString("width", obj.Width?.AsStringValue()); writer.WriteOptionalAttributeString("endianness", obj.Endianness?.AsStringValue()); if (obj.Rom is not null && obj.Rom.Length > 0)