From a8c060ff2687cade1c2410bb65616497b4df56bb Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Fri, 3 Apr 2026 23:33:11 -0400 Subject: [PATCH] Turn Condition keys into properties as a test --- .../MetadataExtensions.cs | 26 ++++----- SabreTools.Data.Models/Metadata/Adjuster.cs | 50 ++++++++++++++--- .../Metadata/ConfSetting.cs | 56 ++++++++++++++++--- .../Metadata/Configuration.cs | 6 +- SabreTools.Data.Models/Metadata/DipSwitch.cs | 6 +- SabreTools.Data.Models/Metadata/DipValue.cs | 56 ++++++++++++++++--- .../DatFileTests.FromMetadata.cs | 25 ++++----- .../DatFileTests.ToMetadata.cs | 14 ++--- .../Formats/Adjuster.cs | 21 +++---- .../Formats/ConfSetting.cs | 22 +++----- .../Formats/Configuration.cs | 21 +++---- .../Formats/DipSwitch.cs | 21 +++---- .../Formats/DipValue.cs | 22 +++----- .../DictionaryBaseExtensions.cs | 32 ++++++++--- .../Listxml.Deserializer.cs | 10 ++-- .../Listxml.Serializer.cs | 10 ++-- 16 files changed, 234 insertions(+), 164 deletions(-) diff --git a/SabreTools.Data.Extensions/MetadataExtensions.cs b/SabreTools.Data.Extensions/MetadataExtensions.cs index d43acea9..b9e60f98 100644 --- a/SabreTools.Data.Extensions/MetadataExtensions.cs +++ b/SabreTools.Data.Extensions/MetadataExtensions.cs @@ -143,7 +143,9 @@ namespace SabreTools.Data.Extensions public static DictionaryBase? DeepClone(this DictionaryBase self) { // Handle types that are cloneable - if (self is Analog analog) + if (self is Adjuster adjuster) + return adjuster.Clone() as Adjuster; + else if (self is Analog analog) return analog.Clone() as Analog; else if (self is BiosSet biosSet) return biosSet.Clone() as BiosSet; @@ -155,12 +157,16 @@ namespace SabreTools.Data.Extensions return condition.Clone() as Condition; else if (self is ConfLocation confLocation) return confLocation.Clone() as ConfLocation; + else if (self is ConfSetting confSetting) + return confSetting.Clone() as ConfSetting; else if (self is Control control) return control.Clone() as Control; else if (self is DeviceRef deviceRef) return deviceRef.Clone() as DeviceRef; else if (self is DipLocation dipLocation) return dipLocation.Clone() as DipLocation; + else if (self is DipValue dipValue) + return dipValue.Clone() as DipValue; else if (self is Display display) return display.Clone() as Display; else if (self is Driver driver) @@ -202,24 +208,16 @@ namespace SabreTools.Data.Extensions return null; // Handle individual type properties - if (self is Adjuster selfAdjuster && clone is Adjuster cloneAdjuster) - { - cloneAdjuster.Default = selfAdjuster.Default; - } - else if (self is Archive selfArchive && clone is Archive cloneArchive) + if (self is Archive selfArchive && clone is Archive cloneArchive) { cloneArchive.Description = selfArchive.Description; } else if (self is Configuration selfConfiguration && clone is Configuration cloneConfiguration) { + cloneConfiguration.Condition = selfConfiguration.Condition?.DeepClone() as Condition; cloneConfiguration.Mask = selfConfiguration.Mask; cloneConfiguration.Tag = selfConfiguration.Tag; } - else if (self is ConfSetting selfConfSetting && clone is ConfSetting cloneConfSetting) - { - cloneConfSetting.Default = selfConfSetting.Default; - cloneConfSetting.Value = selfConfSetting.Value; - } else if (self is DataArea selfDataArea && clone is DataArea cloneDataArea) { cloneDataArea.Endianness = selfDataArea.Endianness; @@ -236,15 +234,11 @@ namespace SabreTools.Data.Extensions } else if (self is DipSwitch selfDipSwitch && clone is DipSwitch cloneDipSwitch) { + cloneDipSwitch.Condition = selfDipSwitch.Condition?.DeepClone() as Condition; cloneDipSwitch.Default = selfDipSwitch.Default; cloneDipSwitch.Mask = selfDipSwitch.Mask; cloneDipSwitch.Tag = selfDipSwitch.Tag; } - else if (self is DipValue selfDipValue && clone is DipValue cloneDipValue) - { - cloneDipValue.Default = selfDipValue.Default; - cloneDipValue.Value = selfDipValue.Value; - } else if (self is Disk selfDisk && clone is Disk cloneDisk) { cloneDisk.Optional = selfDisk.Optional; diff --git a/SabreTools.Data.Models/Metadata/Adjuster.cs b/SabreTools.Data.Models/Metadata/Adjuster.cs index c9c8388c..35ed6e8b 100644 --- a/SabreTools.Data.Models/Metadata/Adjuster.cs +++ b/SabreTools.Data.Models/Metadata/Adjuster.cs @@ -1,13 +1,16 @@ +using System; using System.Xml.Serialization; using Newtonsoft.Json; namespace SabreTools.Data.Models.Metadata { [JsonObject("adjuster"), XmlRoot("adjuster")] - public class Adjuster : DatItem + public class Adjuster : DatItem, ICloneable, IEquatable { #region Properties + public Condition? Condition { get; set; } + /// (yes|no) "no" public bool? Default { get; set; } @@ -15,14 +18,43 @@ namespace SabreTools.Data.Models.Metadata #endregion - #region Keys - - // Condition - [NoFilter] - public const string ConditionKey = "condition"; - - #endregion - public Adjuster() => ItemType = ItemType.Adjuster; + + /// + public object Clone() + { + var obj = new Adjuster(); + + obj.Condition = Condition?.Clone() as Condition; + obj.Default = Default; + obj.Name = Name; + + return obj; + } + + /// + public bool Equals(Adjuster? other) + { + // Null never matches + if (other is null) + return false; + + // Properties + if (Default != other.Default) + return false; + + if ((Name is null) ^ (other.Name is null)) + return false; + else if (Name is not null && !Name.Equals(other.Name, StringComparison.OrdinalIgnoreCase)) + return false; + + // Sub-items + if ((Condition is null) ^ (other.Condition is null)) + return false; + else if (Condition is not null && other.Condition is not null && Condition.Equals(other.Condition)) + return false; + + return true; + } } } diff --git a/SabreTools.Data.Models/Metadata/ConfSetting.cs b/SabreTools.Data.Models/Metadata/ConfSetting.cs index 8e5657a5..8a0676c2 100644 --- a/SabreTools.Data.Models/Metadata/ConfSetting.cs +++ b/SabreTools.Data.Models/Metadata/ConfSetting.cs @@ -1,13 +1,16 @@ +using System; using System.Xml.Serialization; using Newtonsoft.Json; namespace SabreTools.Data.Models.Metadata { [JsonObject("confsetting"), XmlRoot("confsetting")] - public class ConfSetting : DatItem + public class ConfSetting : DatItem, ICloneable, IEquatable { #region Properties + public Condition? Condition { get; set; } + /// (yes|no) "no" public bool? Default { get; set; } @@ -17,14 +20,49 @@ namespace SabreTools.Data.Models.Metadata #endregion - #region Keys - - /// Condition - [NoFilter] - public const string ConditionKey = "condition"; - - #endregion - public ConfSetting() => ItemType = ItemType.ConfSetting; + + /// + public object Clone() + { + var obj = new ConfSetting(); + + obj.Condition = Condition?.Clone() as Condition; + obj.Default = Default; + obj.Name = Name; + obj.Value = Value; + + return obj; + } + + /// + public bool Equals(ConfSetting? other) + { + // Null never matches + if (other is null) + return false; + + // Properties + if (Default != other.Default) + return false; + + if ((Name is null) ^ (other.Name is null)) + return false; + else if (Name is not null && !Name.Equals(other.Name, StringComparison.OrdinalIgnoreCase)) + return false; + + if ((Value is null) ^ (other.Value is null)) + return false; + else if (Value is not null && !Value.Equals(other.Value, StringComparison.OrdinalIgnoreCase)) + return false; + + // Sub-items + if ((Condition is null) ^ (other.Condition is null)) + return false; + else if (Condition is not null && other.Condition is not null && Condition.Equals(other.Condition)) + return false; + + return true; + } } } diff --git a/SabreTools.Data.Models/Metadata/Configuration.cs b/SabreTools.Data.Models/Metadata/Configuration.cs index 7af991b0..f158398c 100644 --- a/SabreTools.Data.Models/Metadata/Configuration.cs +++ b/SabreTools.Data.Models/Metadata/Configuration.cs @@ -8,6 +8,8 @@ namespace SabreTools.Data.Models.Metadata { #region Properties + public Condition? Condition { get; set; } + public string? Mask { get; set; } public string? Name { get; set; } @@ -18,10 +20,6 @@ namespace SabreTools.Data.Models.Metadata #region Keys - /// Condition - [NoFilter] - public const string ConditionKey = "condition"; - /// ConfLocation[] [NoFilter] public const string ConfLocationKey = "conflocation"; diff --git a/SabreTools.Data.Models/Metadata/DipSwitch.cs b/SabreTools.Data.Models/Metadata/DipSwitch.cs index bb893028..b7f60c79 100644 --- a/SabreTools.Data.Models/Metadata/DipSwitch.cs +++ b/SabreTools.Data.Models/Metadata/DipSwitch.cs @@ -8,6 +8,8 @@ namespace SabreTools.Data.Models.Metadata { #region Properties + public Condition? Condition { get; set; } + /// (yes|no) "no" public bool? Default { get; set; } @@ -21,10 +23,6 @@ namespace SabreTools.Data.Models.Metadata #region Keys - /// Condition - [NoFilter] - public const string ConditionKey = "condition"; - /// DipLocation[] [NoFilter] public const string DipLocationKey = "diplocation"; diff --git a/SabreTools.Data.Models/Metadata/DipValue.cs b/SabreTools.Data.Models/Metadata/DipValue.cs index cb928ba6..c23ed88f 100644 --- a/SabreTools.Data.Models/Metadata/DipValue.cs +++ b/SabreTools.Data.Models/Metadata/DipValue.cs @@ -1,13 +1,16 @@ +using System; using System.Xml.Serialization; using Newtonsoft.Json; namespace SabreTools.Data.Models.Metadata { [JsonObject("dipvalue"), XmlRoot("dipvalue")] - public class DipValue : DatItem + public class DipValue : DatItem, ICloneable, IEquatable { #region Properties + public Condition? Condition { get; set; } + /// (yes|no) "no" public bool? Default { get; set; } @@ -17,14 +20,49 @@ namespace SabreTools.Data.Models.Metadata #endregion - #region Keys - - /// Condition - [NoFilter] - public const string ConditionKey = "condition"; - - #endregion - public DipValue() => ItemType = ItemType.DipValue; + + /// + public object Clone() + { + var obj = new DipValue(); + + obj.Condition = Condition?.Clone() as Condition; + obj.Default = Default; + obj.Name = Name; + obj.Value = Value; + + return obj; + } + + /// + public bool Equals(DipValue? other) + { + // Null never matches + if (other is null) + return false; + + // Properties + if (Default != other.Default) + return false; + + if ((Name is null) ^ (other.Name is null)) + return false; + else if (Name is not null && !Name.Equals(other.Name, StringComparison.OrdinalIgnoreCase)) + return false; + + if ((Value is null) ^ (other.Value is null)) + return false; + else if (Value is not null && !Value.Equals(other.Value, StringComparison.OrdinalIgnoreCase)) + return false; + + // Sub-items + if ((Condition is null) ^ (other.Condition is null)) + return false; + else if (Condition is not null && other.Condition is not null && Condition.Equals(other.Condition)) + return false; + + return true; + } } } diff --git a/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs b/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs index 6b095fb2..421b9f1e 100644 --- a/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs +++ b/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs @@ -336,7 +336,7 @@ namespace SabreTools.Metadata.DatFiles.Test { return new Data.Models.Metadata.Adjuster { - [Data.Models.Metadata.Adjuster.ConditionKey] = CreateMetadataCondition(), + Condition = CreateMetadataCondition(), Default = true, Name = "name", }; @@ -417,7 +417,7 @@ namespace SabreTools.Metadata.DatFiles.Test { return new Data.Models.Metadata.Configuration { - [Data.Models.Metadata.Configuration.ConditionKey] = CreateMetadataCondition(), + Condition = CreateMetadataCondition(), [Data.Models.Metadata.Configuration.ConfLocationKey] = new Data.Models.Metadata.ConfLocation[] { CreateMetadataConfLocation() }, [Data.Models.Metadata.Configuration.ConfSettingKey] = new Data.Models.Metadata.ConfSetting[] { CreateMetadataConfSetting() }, Mask = "mask", @@ -451,7 +451,7 @@ namespace SabreTools.Metadata.DatFiles.Test { return new Data.Models.Metadata.ConfSetting { - [Data.Models.Metadata.ConfSetting.ConditionKey] = CreateMetadataCondition(), + Condition = CreateMetadataCondition(), Default = true, Name = "name", Value = "value", @@ -513,7 +513,7 @@ namespace SabreTools.Metadata.DatFiles.Test { return new Data.Models.Metadata.DipSwitch { - [Data.Models.Metadata.DipSwitch.ConditionKey] = CreateMetadataCondition(), + Condition = CreateMetadataCondition(), Default = true, [Data.Models.Metadata.DipSwitch.DipLocationKey] = new Data.Models.Metadata.DipLocation[] { CreateMetadataDipLocation() }, [Data.Models.Metadata.DipSwitch.DipValueKey] = new Data.Models.Metadata.DipValue[] { CreateMetadataDipValue() }, @@ -528,7 +528,7 @@ namespace SabreTools.Metadata.DatFiles.Test { return new Data.Models.Metadata.DipValue { - [Data.Models.Metadata.DipValue.ConditionKey] = CreateMetadataCondition(), + Condition = CreateMetadataCondition(), Default = true, Name = "name", Value = "value", @@ -1130,8 +1130,7 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.True(adjuster.Default); Assert.Equal("name", adjuster.Name); - Condition? condition = adjuster.Read(Data.Models.Metadata.Adjuster.ConditionKey); - ValidateCondition(condition); + ValidateCondition(adjuster.Condition); } private static void ValidateAnalog(Analog? analog) @@ -1181,8 +1180,7 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.Equal("name", configuration.Name); Assert.Equal("tag", configuration.Tag); - Condition? condition = configuration.Read(Data.Models.Metadata.Configuration.ConditionKey); - ValidateCondition(condition); + ValidateCondition(configuration.Condition); ConfLocation[]? confLocations = configuration.Read(Data.Models.Metadata.Configuration.ConfLocationKey); Assert.NotNull(confLocations); @@ -1210,8 +1208,7 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.Equal("name", confSetting.Name); Assert.Equal("value", confSetting.Value); - Condition? condition = confSetting.Read(Data.Models.Metadata.ConfSetting.ConditionKey); - ValidateCondition(condition); + ValidateCondition(confSetting.Condition); } private static void ValidateControl(Control? control) @@ -1280,8 +1277,7 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.Equal("name", dipSwitch.Name); Assert.Equal("tag", dipSwitch.Tag); - Condition? condition = dipSwitch.Read(Data.Models.Metadata.DipSwitch.ConditionKey); - ValidateCondition(condition); + ValidateCondition(dipSwitch.Condition); DipLocation[]? dipLocations = dipSwitch.Read(Data.Models.Metadata.DipSwitch.DipLocationKey); Assert.NotNull(dipLocations); @@ -1306,8 +1302,7 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.Equal("name", dipValue.Name); Assert.Equal("value", dipValue.Value); - Condition? condition = dipValue.Read(Data.Models.Metadata.DipValue.ConditionKey); - ValidateCondition(condition); + ValidateCondition(dipValue.Condition); } private static void ValidateDisk(Disk? disk) diff --git a/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs b/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs index de331159..86ffb33f 100644 --- a/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs +++ b/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs @@ -622,7 +622,7 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.True(adjuster.Default); Assert.Equal("name", adjuster.Name); - Data.Models.Metadata.Condition? condition = adjuster.Read(Data.Models.Metadata.Adjuster.ConditionKey); + Data.Models.Metadata.Condition? condition = adjuster.Condition; ValidateMetadataCondition(condition); } @@ -705,8 +705,7 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.Equal("name", configuration.Name); Assert.Equal("tag", configuration.Tag); - Data.Models.Metadata.Condition? condition = configuration.Read(Data.Models.Metadata.Configuration.ConditionKey); - ValidateMetadataCondition(condition); + ValidateMetadataCondition(configuration.Condition); Data.Models.Metadata.ConfLocation[]? confLocations = configuration.ReadArray(Data.Models.Metadata.Configuration.ConfLocationKey); Assert.NotNull(confLocations); @@ -734,8 +733,7 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.Equal("name", confSetting.Name); Assert.Equal("value", confSetting.Value); - Data.Models.Metadata.Condition? condition = confSetting.Read(Data.Models.Metadata.ConfSetting.ConditionKey); - ValidateMetadataCondition(condition); + ValidateMetadataCondition(confSetting.Condition); } private static void ValidateMetadataControl(Data.Models.Metadata.Control? control) @@ -809,8 +807,7 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.Equal("name", dipSwitch.Name); Assert.Equal("tag", dipSwitch.Tag); - Data.Models.Metadata.Condition? condition = dipSwitch.Read(Data.Models.Metadata.DipSwitch.ConditionKey); - ValidateMetadataCondition(condition); + ValidateMetadataCondition(dipSwitch.Condition); Data.Models.Metadata.DipLocation[]? dipLocations = dipSwitch.ReadArray(Data.Models.Metadata.DipSwitch.DipLocationKey); Assert.NotNull(dipLocations); @@ -835,8 +832,7 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.Equal("name", dipValue.Name); Assert.Equal("value", dipValue.Value); - Data.Models.Metadata.Condition? condition = dipValue.Read(Data.Models.Metadata.DipValue.ConditionKey); - ValidateMetadataCondition(condition); + ValidateMetadataCondition(dipValue.Condition); } private static void ValidateMetadataDisk(Data.Models.Metadata.Disk? disk) diff --git a/SabreTools.Metadata.DatItems/Formats/Adjuster.cs b/SabreTools.Metadata.DatItems/Formats/Adjuster.cs index e9e78192..cc030b36 100644 --- a/SabreTools.Metadata.DatItems/Formats/Adjuster.cs +++ b/SabreTools.Metadata.DatItems/Formats/Adjuster.cs @@ -12,15 +12,10 @@ namespace SabreTools.Metadata.DatItems.Formats { #region Fields + public Condition? Condition { get; set; } + [JsonIgnore] - public bool ConditionsSpecified - { - get - { - var conditions = Read(Data.Models.Metadata.Adjuster.ConditionKey); - return conditions is not null && conditions.Length > 0; - } - } + public bool ConditionSpecified => Condition is not null; public bool? Default { @@ -47,9 +42,8 @@ namespace SabreTools.Metadata.DatItems.Formats public Adjuster(Data.Models.Metadata.Adjuster item) : base(item) { // Handle subitems - var condition = item.Read(Data.Models.Metadata.Adjuster.ConditionKey); - if (condition is not null) - Write(Data.Models.Metadata.Adjuster.ConditionKey, new Condition(condition)); + if (item.Condition is not null) + Condition = new Condition(item.Condition); } public Adjuster(Data.Models.Metadata.Adjuster item, Machine machine, Source source) : this(item) @@ -70,9 +64,8 @@ namespace SabreTools.Metadata.DatItems.Formats { var adjusterItem = base.GetInternalClone(); - var condition = Read(Data.Models.Metadata.Adjuster.ConditionKey); - if (condition is not null) - adjusterItem[Data.Models.Metadata.Adjuster.ConditionKey] = condition.GetInternalClone(); + if (Condition is not null) + adjusterItem.Condition = Condition.GetInternalClone(); return adjusterItem; } diff --git a/SabreTools.Metadata.DatItems/Formats/ConfSetting.cs b/SabreTools.Metadata.DatItems/Formats/ConfSetting.cs index 4577d6ef..93b36953 100644 --- a/SabreTools.Metadata.DatItems/Formats/ConfSetting.cs +++ b/SabreTools.Metadata.DatItems/Formats/ConfSetting.cs @@ -12,15 +12,10 @@ namespace SabreTools.Metadata.DatItems.Formats { #region Fields + public Condition? Condition { get; set; } + [JsonIgnore] - public bool ConditionsSpecified - { - get - { - var conditions = Read(Data.Models.Metadata.ConfSetting.ConditionKey); - return conditions is not null && conditions.Length > 0; - } - } + public bool ConditionSpecified => Condition is not null; public bool? Default { @@ -53,9 +48,8 @@ namespace SabreTools.Metadata.DatItems.Formats public ConfSetting(Data.Models.Metadata.ConfSetting item) : base(item) { // Handle subitems - var condition = Read(Data.Models.Metadata.ConfSetting.ConditionKey); - if (condition is not null) - Write(Data.Models.Metadata.ConfSetting.ConditionKey, new Condition(condition)); + if (item.Condition is not null) + Condition = new Condition(item.Condition); } public ConfSetting(Data.Models.Metadata.ConfSetting item, Machine machine, Source source) : this(item) @@ -76,10 +70,8 @@ namespace SabreTools.Metadata.DatItems.Formats { var confSettingItem = base.GetInternalClone(); - // Handle subitems - var condition = Read(Data.Models.Metadata.ConfSetting.ConditionKey); - if (condition is not null) - confSettingItem[Data.Models.Metadata.ConfSetting.ConditionKey] = condition.GetInternalClone(); + if (Condition is not null) + confSettingItem.Condition = Condition.GetInternalClone(); return confSettingItem; } diff --git a/SabreTools.Metadata.DatItems/Formats/Configuration.cs b/SabreTools.Metadata.DatItems/Formats/Configuration.cs index 0aebec88..dd8d9d09 100644 --- a/SabreTools.Metadata.DatItems/Formats/Configuration.cs +++ b/SabreTools.Metadata.DatItems/Formats/Configuration.cs @@ -13,15 +13,10 @@ namespace SabreTools.Metadata.DatItems.Formats { #region Fields + public Condition? Condition { get; set; } + [JsonIgnore] - public bool ConditionsSpecified - { - get - { - var conditions = Read(Data.Models.Metadata.Configuration.ConditionKey); - return conditions is not null && conditions.Length > 0; - } - } + public bool ConditionSpecified => Condition is not null; /// /> public override Data.Models.Metadata.ItemType ItemType @@ -74,9 +69,8 @@ namespace SabreTools.Metadata.DatItems.Formats public Configuration(Data.Models.Metadata.Configuration item) : base(item) { // Handle subitems - var condition = item.Read(Data.Models.Metadata.Configuration.ConditionKey); - if (condition is not null) - Write(Data.Models.Metadata.Configuration.ConditionKey, new Condition(condition)); + if (item.Condition is not null) + Condition = new Condition(item.Condition); var confLocations = item.ReadArray(Data.Models.Metadata.Configuration.ConfLocationKey); if (confLocations is not null) @@ -111,9 +105,8 @@ namespace SabreTools.Metadata.DatItems.Formats { var configurationItem = base.GetInternalClone(); - var condition = Read(Data.Models.Metadata.Configuration.ConditionKey); - if (condition is not null) - configurationItem[Data.Models.Metadata.Configuration.ConditionKey] = condition.GetInternalClone(); + if (Condition is not null) + configurationItem.Condition = Condition.GetInternalClone(); var confLocations = Read(Data.Models.Metadata.Configuration.ConfLocationKey); if (confLocations is not null) diff --git a/SabreTools.Metadata.DatItems/Formats/DipSwitch.cs b/SabreTools.Metadata.DatItems/Formats/DipSwitch.cs index 8e52ae80..33ebc72e 100644 --- a/SabreTools.Metadata.DatItems/Formats/DipSwitch.cs +++ b/SabreTools.Metadata.DatItems/Formats/DipSwitch.cs @@ -22,15 +22,10 @@ namespace SabreTools.Metadata.DatItems.Formats #region Fields + public Condition? Condition { get; set; } + [JsonIgnore] - public bool ConditionsSpecified - { - get - { - var conditions = Read(Data.Models.Metadata.DipSwitch.ConditionKey); - return conditions is not null && conditions.Length > 0; - } - } + public bool ConditionSpecified => Condition is not null; [JsonIgnore] public bool? Default @@ -102,9 +97,8 @@ namespace SabreTools.Metadata.DatItems.Formats public DipSwitch(Data.Models.Metadata.DipSwitch item) : base(item) { // Handle subitems - var condition = item.Read(Data.Models.Metadata.DipSwitch.ConditionKey); - if (condition is not null) - Write(Data.Models.Metadata.DipSwitch.ConditionKey, new Condition(condition)); + if (item.Condition is not null) + Condition = new Condition(item.Condition); var dipLocations = item.ReadArray(Data.Models.Metadata.DipSwitch.DipLocationKey); if (dipLocations is not null) @@ -139,9 +133,8 @@ namespace SabreTools.Metadata.DatItems.Formats { var dipSwitchItem = base.GetInternalClone(); - var condition = Read(Data.Models.Metadata.DipSwitch.ConditionKey); - if (condition is not null) - dipSwitchItem[Data.Models.Metadata.DipSwitch.ConditionKey] = condition.GetInternalClone(); + if (Condition is not null) + dipSwitchItem.Condition = Condition.GetInternalClone(); var dipLocations = Read(Data.Models.Metadata.DipSwitch.DipLocationKey); if (dipLocations is not null) diff --git a/SabreTools.Metadata.DatItems/Formats/DipValue.cs b/SabreTools.Metadata.DatItems/Formats/DipValue.cs index 7b352539..916f1385 100644 --- a/SabreTools.Metadata.DatItems/Formats/DipValue.cs +++ b/SabreTools.Metadata.DatItems/Formats/DipValue.cs @@ -12,15 +12,10 @@ namespace SabreTools.Metadata.DatItems.Formats { #region Fields + public Condition? Condition { get; set; } + [JsonIgnore] - public bool ConditionsSpecified - { - get - { - var conditions = Read(Data.Models.Metadata.DipValue.ConditionKey); - return conditions is not null && conditions.Length > 0; - } - } + public bool ConditionSpecified => Condition is not null; public bool? Default { @@ -53,9 +48,8 @@ namespace SabreTools.Metadata.DatItems.Formats public DipValue(Data.Models.Metadata.DipValue item) : base(item) { // Handle subitems - var condition = Read(Data.Models.Metadata.DipValue.ConditionKey); - if (condition is not null) - Write(Data.Models.Metadata.DipValue.ConditionKey, new Condition(condition)); + if (item.Condition is not null) + Condition = new Condition(item.Condition); } public DipValue(Data.Models.Metadata.DipValue item, Machine machine, Source source) : this(item) @@ -76,10 +70,8 @@ namespace SabreTools.Metadata.DatItems.Formats { var dipValueItem = base.GetInternalClone(); - // Handle subitems - var subCondition = Read(Data.Models.Metadata.DipValue.ConditionKey); - if (subCondition is not null) - dipValueItem[Data.Models.Metadata.DipValue.ConditionKey] = subCondition.GetInternalClone(); + if (Condition is not null) + dipValueItem.Condition = Condition.GetInternalClone(); return dipValueItem; } diff --git a/SabreTools.Metadata/DictionaryBaseExtensions.cs b/SabreTools.Metadata/DictionaryBaseExtensions.cs index 9b1b61e8..dc17564b 100644 --- a/SabreTools.Metadata/DictionaryBaseExtensions.cs +++ b/SabreTools.Metadata/DictionaryBaseExtensions.cs @@ -64,7 +64,7 @@ namespace SabreTools.Metadata // Handle individual type properties if (self is Adjuster selfAdjuster && other is Adjuster otherAdjuster) { - if (selfAdjuster.Default != otherAdjuster.Default) + if (!selfAdjuster.Equals(otherAdjuster)) return false; } else if (self is Analog selfAnalog && other is Analog otherAnalog) @@ -98,6 +98,17 @@ namespace SabreTools.Metadata return false; if (selfConfiguration.Tag != otherConfiguration.Tag) return false; + + if ((selfConfiguration.Condition is null) ^ (otherConfiguration.Condition is null)) + { + return false; + } + else if (selfConfiguration.Condition is not null + && otherConfiguration.Condition is not null + && selfConfiguration.Condition.EqualTo(otherConfiguration.Condition)) + { + return false; + } } else if (self is ConfLocation selfConfLocation && other is ConfLocation otherConfLocation) { @@ -106,9 +117,7 @@ namespace SabreTools.Metadata } else if (self is ConfSetting selfConfSetting && other is ConfSetting otherConfSetting) { - if (selfConfSetting.Default != otherConfSetting.Default) - return false; - if (selfConfSetting.Value != otherConfSetting.Value) + if (!selfConfSetting.Equals(otherConfSetting)) return false; } else if (self is Control selfControl && other is Control otherControl) @@ -151,12 +160,21 @@ namespace SabreTools.Metadata return false; if (selfDipSwitch.Tag != otherDipSwitch.Tag) return false; + + if ((selfDipSwitch.Condition is null) ^ (otherDipSwitch.Condition is null)) + { + return false; + } + else if (selfDipSwitch.Condition is not null + && otherDipSwitch.Condition is not null + && selfDipSwitch.Condition.EqualTo(otherDipSwitch.Condition)) + { + return false; + } } else if (self is DipValue selfDipValue && other is DipValue otherDipValue) { - if (selfDipValue.Default != otherDipValue.Default) - return false; - if (selfDipValue.Value != otherDipValue.Value) + if (!selfDipValue.Equals(otherDipValue)) return false; } else if (self is Disk selfDisk && other is Disk otherDisk) diff --git a/SabreTools.Serialization.CrossModel/Listxml.Deserializer.cs b/SabreTools.Serialization.CrossModel/Listxml.Deserializer.cs index c65627ea..4c546f9c 100644 --- a/SabreTools.Serialization.CrossModel/Listxml.Deserializer.cs +++ b/SabreTools.Serialization.CrossModel/Listxml.Deserializer.cs @@ -152,7 +152,7 @@ namespace SabreTools.Serialization.CrossModel Default = item.Default, }; - var condition = item.Read(Data.Models.Metadata.Adjuster.ConditionKey); + var condition = item.Condition; if (condition is not null) adjuster.Condition = ConvertFromInternalModel(condition); @@ -228,7 +228,7 @@ namespace SabreTools.Serialization.CrossModel Mask = item.Mask, }; - var condition = item.Read(Data.Models.Metadata.Configuration.ConditionKey); + var condition = item.Condition; if (condition is not null) configuration.Condition = ConvertFromInternalModel(condition); @@ -269,7 +269,7 @@ namespace SabreTools.Serialization.CrossModel Default = item.Default, }; - var condition = item.Read(Data.Models.Metadata.ConfSetting.ConditionKey); + var condition = item.Condition; if (condition is not null) confSetting.Condition = ConvertFromInternalModel(condition); @@ -362,7 +362,7 @@ namespace SabreTools.Serialization.CrossModel Mask = item.Mask, }; - var condition = item.Read(Data.Models.Metadata.DipSwitch.ConditionKey); + var condition = item.Condition; if (condition is not null) dipSwitch.Condition = ConvertFromInternalModel(condition); @@ -389,7 +389,7 @@ namespace SabreTools.Serialization.CrossModel Default = item.Default, }; - var condition = item.Read(Data.Models.Metadata.DipValue.ConditionKey); + var condition = item.Condition; if (condition is not null) dipValue.Condition = ConvertFromInternalModel(condition); diff --git a/SabreTools.Serialization.CrossModel/Listxml.Serializer.cs b/SabreTools.Serialization.CrossModel/Listxml.Serializer.cs index 8e572716..dc76c959 100644 --- a/SabreTools.Serialization.CrossModel/Listxml.Serializer.cs +++ b/SabreTools.Serialization.CrossModel/Listxml.Serializer.cs @@ -187,7 +187,7 @@ namespace SabreTools.Serialization.CrossModel }; if (item.Condition is not null) - adjuster[Data.Models.Metadata.Adjuster.ConditionKey] = ConvertToInternalModel(item.Condition); + adjuster.Condition = ConvertToInternalModel(item.Condition); return adjuster; } @@ -262,7 +262,7 @@ namespace SabreTools.Serialization.CrossModel }; if (item.Condition is not null) - configuration[Data.Models.Metadata.Configuration.ConditionKey] = ConvertToInternalModel(item.Condition); + configuration.Condition = ConvertToInternalModel(item.Condition); if (item.ConfLocation is not null && item.ConfLocation.Length > 0) { @@ -306,7 +306,7 @@ namespace SabreTools.Serialization.CrossModel }; if (item.Condition is not null) - confSetting[Data.Models.Metadata.ConfSetting.ConditionKey] = ConvertToInternalModel(item.Condition); + confSetting.Condition = ConvertToInternalModel(item.Condition); return confSetting; } @@ -399,7 +399,7 @@ namespace SabreTools.Serialization.CrossModel }; if (item.Condition is not null) - dipSwitch[Data.Models.Metadata.DipSwitch.ConditionKey] = ConvertToInternalModel(item.Condition); + dipSwitch.Condition = ConvertToInternalModel(item.Condition); if (item.DipLocation is not null && item.DipLocation.Length > 0) { @@ -429,7 +429,7 @@ namespace SabreTools.Serialization.CrossModel }; if (item.Condition is not null) - dipValue[Data.Models.Metadata.DipValue.ConditionKey] = ConvertToInternalModel(item.Condition); + dipValue.Condition = ConvertToInternalModel(item.Condition); return dipValue; }