diff --git a/SabreTools.Data.Extensions.Test/MetadataExtensionsTests.cs b/SabreTools.Data.Extensions.Test/MetadataExtensionsTests.cs
index f4bc8b55..cf97ee9d 100644
--- a/SabreTools.Data.Extensions.Test/MetadataExtensionsTests.cs
+++ b/SabreTools.Data.Extensions.Test/MetadataExtensionsTests.cs
@@ -1864,8 +1864,10 @@ namespace SabreTools.Data.Extensions.Test
[Theory]
[InlineData(null, null)]
[InlineData("INVALID", null)]
+ [InlineData("1", true)]
[InlineData("yes", true)]
[InlineData("True", true)]
+ [InlineData("0", false)]
[InlineData("no", false)]
[InlineData("False", false)]
public void AsYesNoTest(string? field, bool? expected)
diff --git a/SabreTools.Data.Extensions/MetadataExtensions.cs b/SabreTools.Data.Extensions/MetadataExtensions.cs
index f1700a2a..794373df 100644
--- a/SabreTools.Data.Extensions/MetadataExtensions.cs
+++ b/SabreTools.Data.Extensions/MetadataExtensions.cs
@@ -184,6 +184,7 @@ namespace SabreTools.Data.Extensions
else if (self is Device selfDevice && clone is Device cloneDevice)
{
cloneDevice.DeviceType = selfDevice.DeviceType;
+ cloneDevice.Mandatory = selfDevice.Mandatory;
}
else if (self is DipLocation selfDipLocation && clone is DipLocation cloneDipLocation)
{
@@ -1402,8 +1403,8 @@ namespace SabreTools.Data.Extensions
{
return yesno?.ToLowerInvariant() switch
{
- "yes" or "true" => true,
- "no" or "false" => false,
+ "1" or "yes" or "true" => true,
+ "0" or "no" or "false" => false,
_ => null,
};
}
diff --git a/SabreTools.Data.Models/Listxml/Device.cs b/SabreTools.Data.Models/Listxml/Device.cs
index 45a26277..ef377197 100644
--- a/SabreTools.Data.Models/Listxml/Device.cs
+++ b/SabreTools.Data.Models/Listxml/Device.cs
@@ -18,9 +18,9 @@ namespace SabreTools.Data.Models.Listxml
[XmlAttribute("fixed_image")]
public string? FixedImage { get; set; }
- /// Numeric boolean
+ /// (0|1) "0"
[XmlAttribute("mandatory")]
- public string? Mandatory { get; set; }
+ public bool? Mandatory { get; set; }
[XmlAttribute("interface")]
public string? Interface { get; set; }
diff --git a/SabreTools.Data.Models/Metadata/Device.cs b/SabreTools.Data.Models/Metadata/Device.cs
index 3d17f455..6165eb4b 100644
--- a/SabreTools.Data.Models/Metadata/Device.cs
+++ b/SabreTools.Data.Models/Metadata/Device.cs
@@ -11,6 +11,9 @@ namespace SabreTools.Data.Models.Metadata
/// (unknown|cartridge|floppydisk|harddisk|cylinder|cassette|punchcard|punchtape|printout|serial|parallel|snapshot|quickload|memcard|cdrom|magtape|romimage|midiin|midiout|picture|vidfile)
public DeviceType? DeviceType { get; set; }
+ /// (0|1) "0"
+ public bool? Mandatory { get; set; }
+
#endregion
#region Keys
@@ -29,10 +32,6 @@ namespace SabreTools.Data.Models.Metadata
/// string
public const string InterfaceKey = "interface";
- /// (0|1) "0"
- /// TODO: Convert to bool?
- public const string MandatoryKey = "mandatory";
-
/// string
public const string TagKey = "tag";
diff --git a/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs b/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs
index dcdc1daf..117109d3 100644
--- a/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs
+++ b/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs
@@ -485,7 +485,7 @@ namespace SabreTools.Metadata.DatFiles.Test
[Data.Models.Metadata.Device.FixedImageKey] = "fixedimage",
[Data.Models.Metadata.Device.InstanceKey] = CreateMetadataInstance(),
[Data.Models.Metadata.Device.InterfaceKey] = "interface",
- [Data.Models.Metadata.Device.MandatoryKey] = 1L,
+ Mandatory = true,
[Data.Models.Metadata.Device.TagKey] = "tag",
DeviceType = Data.Models.Metadata.DeviceType.PunchTape,
};
@@ -1262,7 +1262,7 @@ namespace SabreTools.Metadata.DatFiles.Test
Assert.NotNull(device);
Assert.Equal("fixedimage", device.ReadString(Data.Models.Metadata.Device.FixedImageKey));
Assert.Equal("interface", device.ReadString(Data.Models.Metadata.Device.InterfaceKey));
- Assert.Equal(1, device.ReadLong(Data.Models.Metadata.Device.MandatoryKey));
+ Assert.Equal(true, device.Mandatory);
Assert.Equal("tag", device.ReadString(Data.Models.Metadata.Device.TagKey));
Assert.Equal(Data.Models.Metadata.DeviceType.PunchTape, device.DeviceType);
diff --git a/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs b/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs
index 2bfb50e0..7e7e06a2 100644
--- a/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs
+++ b/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs
@@ -774,7 +774,7 @@ namespace SabreTools.Metadata.DatFiles.Test
Assert.NotNull(device);
Assert.Equal("fixedimage", device.ReadString(Data.Models.Metadata.Device.FixedImageKey));
Assert.Equal("interface", device.ReadString(Data.Models.Metadata.Device.InterfaceKey));
- Assert.Equal(1, device.ReadLong(Data.Models.Metadata.Device.MandatoryKey));
+ Assert.Equal(true, device.Mandatory);
Assert.Equal("tag", device.ReadString(Data.Models.Metadata.Device.TagKey));
Assert.Equal(Data.Models.Metadata.DeviceType.PunchTape, device.DeviceType);
diff --git a/SabreTools.Metadata.DatItems/Formats/Device.cs b/SabreTools.Metadata.DatItems/Formats/Device.cs
index 57ce5981..ff14ce51 100644
--- a/SabreTools.Metadata.DatItems/Formats/Device.cs
+++ b/SabreTools.Metadata.DatItems/Formats/Device.cs
@@ -39,6 +39,12 @@ namespace SabreTools.Metadata.DatItems.Formats
}
}
+ public bool? Mandatory
+ {
+ get => (_internal as Data.Models.Metadata.Device)?.Mandatory;
+ set => (_internal as Data.Models.Metadata.Device)?.Mandatory = value;
+ }
+
#endregion
#region Constructors
@@ -47,11 +53,6 @@ namespace SabreTools.Metadata.DatItems.Formats
public Device(Data.Models.Metadata.Device item) : base(item)
{
- // Process flag values
- bool? mandatory = ReadBool(Data.Models.Metadata.Device.MandatoryKey);
- if (mandatory is not null)
- Write(Data.Models.Metadata.Device.MandatoryKey, mandatory.FromYesNo());
-
// Handle subitems
var instance = item.Read(Data.Models.Metadata.Device.InstanceKey);
if (instance is not null)
diff --git a/SabreTools.Metadata.Filter/FilterObject.cs b/SabreTools.Metadata.Filter/FilterObject.cs
index 3c742bb3..7c624720 100644
--- a/SabreTools.Metadata.Filter/FilterObject.cs
+++ b/SabreTools.Metadata.Filter/FilterObject.cs
@@ -389,6 +389,9 @@ namespace SabreTools.Metadata.Filter
case Device item when fieldName == "type":
checkValue = item.DeviceType?.AsStringValue();
return true;
+ case Device item when fieldName == "mandatory":
+ checkValue = item.Mandatory.FromYesNo();
+ return true;
case DipLocation item when fieldName == "inverted":
checkValue = item.Inverted.FromYesNo();
diff --git a/SabreTools.Serialization.CrossModel.Test/ListxmlTests.cs b/SabreTools.Serialization.CrossModel.Test/ListxmlTests.cs
index fdfca515..734cfa18 100644
--- a/SabreTools.Serialization.CrossModel.Test/ListxmlTests.cs
+++ b/SabreTools.Serialization.CrossModel.Test/ListxmlTests.cs
@@ -293,7 +293,7 @@ namespace SabreTools.Serialization.CrossModel.Test
Type = Data.Models.Metadata.DeviceType.PunchTape,
Tag = "XXXXXX",
FixedImage = "XXXXXX",
- Mandatory = "XXXXXX",
+ Mandatory = true,
Interface = "XXXXXX",
Instance = instance,
Extension = [extension],
@@ -800,7 +800,7 @@ namespace SabreTools.Serialization.CrossModel.Test
Assert.Equal(Data.Models.Metadata.DeviceType.PunchTape, device.Type);
Assert.Equal("XXXXXX", device.Tag);
Assert.Equal("XXXXXX", device.FixedImage);
- Assert.Equal("XXXXXX", device.Mandatory);
+ Assert.Equal(true, device.Mandatory);
Assert.Equal("XXXXXX", device.Interface);
Validate(device.Instance);
diff --git a/SabreTools.Serialization.CrossModel.Test/M1Tests.cs b/SabreTools.Serialization.CrossModel.Test/M1Tests.cs
index 16e28c35..57fe2ba8 100644
--- a/SabreTools.Serialization.CrossModel.Test/M1Tests.cs
+++ b/SabreTools.Serialization.CrossModel.Test/M1Tests.cs
@@ -289,7 +289,7 @@ namespace SabreTools.Serialization.CrossModel.Test
Type = Data.Models.Metadata.DeviceType.PunchTape,
Tag = "XXXXXX",
FixedImage = "XXXXXX",
- Mandatory = "XXXXXX",
+ Mandatory = true,
Interface = "XXXXXX",
Instance = instance,
Extension = [extension],
@@ -794,7 +794,7 @@ namespace SabreTools.Serialization.CrossModel.Test
Assert.Equal(Data.Models.Metadata.DeviceType.PunchTape, device.Type);
Assert.Equal("XXXXXX", device.Tag);
Assert.Equal("XXXXXX", device.FixedImage);
- Assert.Equal("XXXXXX", device.Mandatory);
+ Assert.Equal(true, device.Mandatory);
Assert.Equal("XXXXXX", device.Interface);
Validate(device.Instance);
diff --git a/SabreTools.Serialization.CrossModel.Test/MessTests.cs b/SabreTools.Serialization.CrossModel.Test/MessTests.cs
index 96911cf5..778266fa 100644
--- a/SabreTools.Serialization.CrossModel.Test/MessTests.cs
+++ b/SabreTools.Serialization.CrossModel.Test/MessTests.cs
@@ -289,7 +289,7 @@ namespace SabreTools.Serialization.CrossModel.Test
Type = Data.Models.Metadata.DeviceType.PunchTape,
Tag = "XXXXXX",
FixedImage = "XXXXXX",
- Mandatory = "XXXXXX",
+ Mandatory = true,
Interface = "XXXXXX",
Instance = instance,
Extension = [extension],
@@ -794,7 +794,7 @@ namespace SabreTools.Serialization.CrossModel.Test
Assert.Equal(Data.Models.Metadata.DeviceType.PunchTape, device.Type);
Assert.Equal("XXXXXX", device.Tag);
Assert.Equal("XXXXXX", device.FixedImage);
- Assert.Equal("XXXXXX", device.Mandatory);
+ Assert.Equal(true, device.Mandatory);
Assert.Equal("XXXXXX", device.Interface);
Validate(device.Instance);
diff --git a/SabreTools.Serialization.CrossModel/Listxml.Deserializer.cs b/SabreTools.Serialization.CrossModel/Listxml.Deserializer.cs
index 02a38a83..4e17acd2 100644
--- a/SabreTools.Serialization.CrossModel/Listxml.Deserializer.cs
+++ b/SabreTools.Serialization.CrossModel/Listxml.Deserializer.cs
@@ -309,7 +309,7 @@ namespace SabreTools.Serialization.CrossModel
Type = item.DeviceType,
Tag = item.ReadString(Data.Models.Metadata.Device.TagKey),
FixedImage = item.ReadString(Data.Models.Metadata.Device.FixedImageKey),
- Mandatory = item.ReadString(Data.Models.Metadata.Device.MandatoryKey),
+ Mandatory = item.Mandatory,
Interface = item.ReadString(Data.Models.Metadata.Device.InterfaceKey),
};
diff --git a/SabreTools.Serialization.CrossModel/Listxml.Serializer.cs b/SabreTools.Serialization.CrossModel/Listxml.Serializer.cs
index 10c5e034..01d8fa7e 100644
--- a/SabreTools.Serialization.CrossModel/Listxml.Serializer.cs
+++ b/SabreTools.Serialization.CrossModel/Listxml.Serializer.cs
@@ -344,7 +344,7 @@ namespace SabreTools.Serialization.CrossModel
DeviceType = item.Type,
[Data.Models.Metadata.Device.TagKey] = item.Tag,
[Data.Models.Metadata.Device.FixedImageKey] = item.FixedImage,
- [Data.Models.Metadata.Device.MandatoryKey] = item.Mandatory,
+ Mandatory = item.Mandatory,
[Data.Models.Metadata.Device.InterfaceKey] = item.Interface,
};
diff --git a/SabreTools.Serialization.Readers.Test/ListxmlTests.cs b/SabreTools.Serialization.Readers.Test/ListxmlTests.cs
index 6cfd1795..439b3a9e 100644
--- a/SabreTools.Serialization.Readers.Test/ListxmlTests.cs
+++ b/SabreTools.Serialization.Readers.Test/ListxmlTests.cs
@@ -360,7 +360,7 @@ namespace SabreTools.Serialization.Readers.Test
Type = Data.Models.Metadata.DeviceType.PunchTape,
Tag = "XXXXXX",
FixedImage = "XXXXXX",
- Mandatory = "XXXXXX",
+ Mandatory = true,
Interface = "XXXXXX",
Instance = instance,
Extension = [extension],
@@ -867,7 +867,7 @@ namespace SabreTools.Serialization.Readers.Test
Assert.Equal(Data.Models.Metadata.DeviceType.PunchTape, device.Type);
Assert.Equal("XXXXXX", device.Tag);
Assert.Equal("XXXXXX", device.FixedImage);
- Assert.Equal("XXXXXX", device.Mandatory);
+ Assert.Equal(true, device.Mandatory);
Assert.Equal("XXXXXX", device.Interface);
Validate(device.Instance);
diff --git a/SabreTools.Serialization.Readers.Test/M1Tests.cs b/SabreTools.Serialization.Readers.Test/M1Tests.cs
index cbff6514..90be4b60 100644
--- a/SabreTools.Serialization.Readers.Test/M1Tests.cs
+++ b/SabreTools.Serialization.Readers.Test/M1Tests.cs
@@ -356,7 +356,7 @@ namespace SabreTools.Serialization.Readers.Test
Type = Data.Models.Metadata.DeviceType.PunchTape,
Tag = "XXXXXX",
FixedImage = "XXXXXX",
- Mandatory = "XXXXXX",
+ Mandatory = true,
Interface = "XXXXXX",
Instance = instance,
Extension = [extension],
@@ -861,7 +861,7 @@ namespace SabreTools.Serialization.Readers.Test
Assert.Equal(Data.Models.Metadata.DeviceType.PunchTape, device.Type);
Assert.Equal("XXXXXX", device.Tag);
Assert.Equal("XXXXXX", device.FixedImage);
- Assert.Equal("XXXXXX", device.Mandatory);
+ Assert.Equal(true, device.Mandatory);
Assert.Equal("XXXXXX", device.Interface);
Validate(device.Instance);
diff --git a/SabreTools.Serialization.Readers.Test/MessTests.cs b/SabreTools.Serialization.Readers.Test/MessTests.cs
index 4b798855..3eee2b80 100644
--- a/SabreTools.Serialization.Readers.Test/MessTests.cs
+++ b/SabreTools.Serialization.Readers.Test/MessTests.cs
@@ -356,7 +356,7 @@ namespace SabreTools.Serialization.Readers.Test
Type = Data.Models.Metadata.DeviceType.PunchTape,
Tag = "XXXXXX",
FixedImage = "XXXXXX",
- Mandatory = "XXXXXX",
+ Mandatory = true,
Interface = "XXXXXX",
Instance = instance,
Extension = [extension],
@@ -861,7 +861,7 @@ namespace SabreTools.Serialization.Readers.Test
Assert.Equal(Data.Models.Metadata.DeviceType.PunchTape, device.Type);
Assert.Equal("XXXXXX", device.Tag);
Assert.Equal("XXXXXX", device.FixedImage);
- Assert.Equal("XXXXXX", device.Mandatory);
+ Assert.Equal(true, device.Mandatory);
Assert.Equal("XXXXXX", device.Interface);
Validate(device.Instance);
diff --git a/SabreTools.Serialization.Readers/Listxml.cs b/SabreTools.Serialization.Readers/Listxml.cs
index 2b868c56..9e38ba06 100644
--- a/SabreTools.Serialization.Readers/Listxml.cs
+++ b/SabreTools.Serialization.Readers/Listxml.cs
@@ -368,7 +368,7 @@ namespace SabreTools.Serialization.Readers
obj.Type = reader.GetAttribute("type").AsDeviceType();
obj.Tag = reader.GetAttribute("tag");
obj.FixedImage = reader.GetAttribute("fixed_image");
- obj.Mandatory = reader.GetAttribute("mandatory");
+ obj.Mandatory = reader.GetAttribute("mandatory").AsYesNo();
obj.Interface = reader.GetAttribute("interface");
List extensions = [];
diff --git a/SabreTools.Serialization.Readers/M1.cs b/SabreTools.Serialization.Readers/M1.cs
index efc59aed..154c9aab 100644
--- a/SabreTools.Serialization.Readers/M1.cs
+++ b/SabreTools.Serialization.Readers/M1.cs
@@ -366,7 +366,7 @@ namespace SabreTools.Serialization.Readers
obj.Type = reader.GetAttribute("type").AsDeviceType();
obj.Tag = reader.GetAttribute("tag");
obj.FixedImage = reader.GetAttribute("fixed_image");
- obj.Mandatory = reader.GetAttribute("mandatory");
+ obj.Mandatory = reader.GetAttribute("mandatory").AsYesNo();
obj.Interface = reader.GetAttribute("interface");
List extensions = [];
diff --git a/SabreTools.Serialization.Readers/Mess.cs b/SabreTools.Serialization.Readers/Mess.cs
index bf568a0e..a39567c4 100644
--- a/SabreTools.Serialization.Readers/Mess.cs
+++ b/SabreTools.Serialization.Readers/Mess.cs
@@ -366,7 +366,7 @@ namespace SabreTools.Serialization.Readers
obj.Type = reader.GetAttribute("type").AsDeviceType();
obj.Tag = reader.GetAttribute("tag");
obj.FixedImage = reader.GetAttribute("fixed_image");
- obj.Mandatory = reader.GetAttribute("mandatory");
+ obj.Mandatory = reader.GetAttribute("mandatory").AsYesNo();
obj.Interface = reader.GetAttribute("interface");
List extensions = [];
diff --git a/SabreTools.Serialization.Writers/Listxml.cs b/SabreTools.Serialization.Writers/Listxml.cs
index 01c8313e..cc458cf6 100644
--- a/SabreTools.Serialization.Writers/Listxml.cs
+++ b/SabreTools.Serialization.Writers/Listxml.cs
@@ -256,7 +256,8 @@ namespace SabreTools.Serialization.Writers
writer.WriteRequiredAttributeString("type", obj.Type?.AsStringValue());
writer.WriteOptionalAttributeString("tag", obj.Tag);
writer.WriteOptionalAttributeString("fixed_image", obj.FixedImage);
- writer.WriteOptionalAttributeString("mandatory", obj.Mandatory);
+ if (obj.Mandatory is not null)
+ writer.WriteOptionalAttributeString("mandatory", obj.Mandatory.Value ? "1" : "0");
writer.WriteOptionalAttributeString("interface", obj.Interface);
if (obj.Instance is not null)
diff --git a/SabreTools.Serialization.Writers/M1.cs b/SabreTools.Serialization.Writers/M1.cs
index b9fcdb21..7f4137e6 100644
--- a/SabreTools.Serialization.Writers/M1.cs
+++ b/SabreTools.Serialization.Writers/M1.cs
@@ -254,7 +254,8 @@ namespace SabreTools.Serialization.Writers
writer.WriteRequiredAttributeString("type", obj.Type?.AsStringValue());
writer.WriteOptionalAttributeString("tag", obj.Tag);
writer.WriteOptionalAttributeString("fixed_image", obj.FixedImage);
- writer.WriteOptionalAttributeString("mandatory", obj.Mandatory);
+ if (obj.Mandatory is not null)
+ writer.WriteOptionalAttributeString("mandatory", obj.Mandatory.Value ? "1" : "0");
writer.WriteOptionalAttributeString("interface", obj.Interface);
if (obj.Instance is not null)
diff --git a/SabreTools.Serialization.Writers/Mess.cs b/SabreTools.Serialization.Writers/Mess.cs
index 0a2e83c9..c74c693a 100644
--- a/SabreTools.Serialization.Writers/Mess.cs
+++ b/SabreTools.Serialization.Writers/Mess.cs
@@ -254,7 +254,8 @@ namespace SabreTools.Serialization.Writers
writer.WriteRequiredAttributeString("type", obj.Type?.AsStringValue());
writer.WriteOptionalAttributeString("tag", obj.Tag);
writer.WriteOptionalAttributeString("fixed_image", obj.FixedImage);
- writer.WriteOptionalAttributeString("mandatory", obj.Mandatory);
+ if (obj.Mandatory is not null)
+ writer.WriteOptionalAttributeString("mandatory", obj.Mandatory.Value ? "1" : "0");
writer.WriteOptionalAttributeString("interface", obj.Interface);
if (obj.Instance is not null)