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)