Original is cloneable and comparable

This commit is contained in:
Matt Nadareski
2026-04-03 13:48:43 -04:00
parent 716abed8b8
commit 62b2fd3325
15 changed files with 56 additions and 30 deletions

View File

@@ -174,6 +174,8 @@ namespace SabreTools.Data.Extensions
return info.Clone() as Info;
else if (self is Instance instance)
return instance.Clone() as Instance;
else if (self is Original original)
return original.Clone() as Original;
else if (self is RamOption ramOption)
return ramOption.Clone() as RamOption;
else if (self is SharedFeat sharedFeat)
@@ -301,10 +303,6 @@ namespace SabreTools.Data.Extensions
cloneMachine.Runnable = selfMachine.Runnable;
cloneMachine.Supported = selfMachine.Supported;
}
else if (self is Original selfOriginal && clone is Original cloneOriginal)
{
cloneOriginal.Content = selfOriginal.Content;
}
else if (self is Part selfPart && clone is Part clonePart)
{
clonePart.Interface = selfPart.Interface;

View File

@@ -1,24 +1,50 @@
using System;
using System.Xml.Serialization;
using Newtonsoft.Json;
namespace SabreTools.Data.Models.Metadata
{
[JsonObject("original"), XmlRoot("original")]
public class Original : DatItem
public class Original : DatItem, ICloneable, IEquatable<Original>
{
#region Properties
public string? Content { get; set; }
#endregion
#region Keys
/// <remarks>bool</remarks>
public const string ValueKey = "value";
public bool? Value { get; set; }
#endregion
public Original() => ItemType = ItemType.Original;
/// <inheritdoc/>
public object Clone()
{
var obj = new Original();
obj.Content = Content;
obj.Value = Value;
return obj;
}
/// <inheritdoc/>
public bool Equals(Original? other)
{
// Null never matches
if (other is null)
return false;
// Properties
if ((Content is null) ^ (other.Content is null))
return false;
else if (Content is not null && !Content.Equals(other.Content, StringComparison.OrdinalIgnoreCase))
return false;
if (Value != other.Value)
return false;
return true;
}
}
}

View File

@@ -6,9 +6,8 @@ namespace SabreTools.Data.Models.OpenMSX
[XmlRoot("original")]
public class Original
{
/// <remarks>Boolean?</remarks>
[XmlAttribute("value")]
public string? Value { get; set; }
public bool? Value { get; set; }
[XmlText]
public string? Content { get; set; }

View File

@@ -697,7 +697,7 @@ namespace SabreTools.Metadata.DatFiles.Test
return new Data.Models.Metadata.Original
{
Content = "content",
[Data.Models.Metadata.Original.ValueKey] = true,
Value = true,
};
}

View File

@@ -1,6 +1,5 @@
using System.Collections.Generic;
using System.Linq;
using SabreTools.Data.Extensions;
using SabreTools.Metadata.DatItems;
using OpenMSXSubType = SabreTools.Data.Models.Metadata.OpenMSXSubType;
@@ -983,7 +982,7 @@ namespace SabreTools.Metadata.DatFiles
{
var newOriginal = new Data.Models.Metadata.Original
{
[Data.Models.Metadata.Original.ValueKey] = romOriginal.Value.FromYesNo(),
Value = romOriginal.Value,
Content = romOriginal.Content,
};
dumpRom[Data.Models.Metadata.Dump.OriginalKey] = newOriginal;
@@ -1011,7 +1010,7 @@ namespace SabreTools.Metadata.DatFiles
{
var newOriginal = new Data.Models.Metadata.Original
{
[Data.Models.Metadata.Original.ValueKey] = megaRomOriginal.Value.FromYesNo(),
Value = megaRomOriginal.Value,
Content = megaRomOriginal.Content,
};
dumpMegaRom[Data.Models.Metadata.Dump.OriginalKey] = newOriginal;
@@ -1039,7 +1038,7 @@ namespace SabreTools.Metadata.DatFiles
{
var newOriginal = new Data.Models.Metadata.Original
{
[Data.Models.Metadata.Original.ValueKey] = sccPlusCartOriginal.Value.FromYesNo(),
Value = sccPlusCartOriginal.Value,
Content = sccPlusCartOriginal.Content,
};
dumpSccPlusCart[Data.Models.Metadata.Dump.OriginalKey] = newOriginal;

View File

@@ -25,8 +25,8 @@ namespace SabreTools.Metadata.DatItems.Formats
[JsonProperty("value"), XmlElement("value")]
public bool? Value
{
get => _internal.ReadBool(Data.Models.Metadata.Original.ValueKey);
set => _internal[Data.Models.Metadata.Original.ValueKey] = value;
get => _internal.Value;
set => _internal.Value = value;
}
#endregion

View File

@@ -191,7 +191,7 @@ namespace SabreTools.Metadata.DatItems.Formats
{
Write<Original?>("ORIGINAL", new Original
{
Value = original.ReadBool(Data.Models.Metadata.Original.ValueKey),
Value = original.Value,
Content = original.Content,
});
}

View File

@@ -752,6 +752,9 @@ namespace SabreTools.Metadata.Filter
case Original item when fieldName == "content":
checkValue = item.Content;
return true;
case Original item when fieldName == "value":
checkValue = item.Value.FromYesNo();
return true;
case Part item when fieldName == "interface":
checkValue = item.Interface;

View File

@@ -291,7 +291,7 @@ namespace SabreTools.Metadata
}
else if (self is Original selfOriginal && other is Original otherOriginal)
{
if (selfOriginal.Content != otherOriginal.Content)
if (!selfOriginal.Equals(otherOriginal))
return false;
}
else if (self is Part selfPart && other is Part otherPart)

View File

@@ -36,7 +36,7 @@ namespace SabreTools.Serialization.CrossModel.Test
{
var original = new Data.Models.OpenMSX.Original
{
Value = "value",
Value = true,
Content = "content",
};
@@ -137,7 +137,7 @@ namespace SabreTools.Serialization.CrossModel.Test
private static void Validate(Data.Models.OpenMSX.Original? original)
{
Assert.NotNull(original);
Assert.Equal("value", original.Value);
Assert.Equal(true, original.Value);
Assert.Equal("content", original.Content);
}

View File

@@ -103,7 +103,7 @@ namespace SabreTools.Serialization.CrossModel
{
var original = new Original
{
Value = item.ReadString(Data.Models.Metadata.Original.ValueKey),
Value = item.Value,
Content = item.Content,
};
return original;

View File

@@ -103,7 +103,7 @@ namespace SabreTools.Serialization.CrossModel
{
var original = new Data.Models.Metadata.Original
{
[Data.Models.Metadata.Original.ValueKey] = item.Value,
Value = item.Value,
Content = item.Content,
};
return original;

View File

@@ -102,7 +102,7 @@ namespace SabreTools.Serialization.Readers.Test
{
var original = new Data.Models.OpenMSX.Original
{
Value = "value",
Value = true,
Content = "content",
};
@@ -203,7 +203,7 @@ namespace SabreTools.Serialization.Readers.Test
private static void Validate(Data.Models.OpenMSX.Original? original)
{
Assert.NotNull(original);
Assert.Equal("value", original.Value);
Assert.Equal(true, original.Value);
Assert.Equal("content", original.Content);
}

View File

@@ -2,6 +2,7 @@ using System;
using System.Collections.Generic;
using System.IO;
using System.Xml;
using SabreTools.Data.Extensions;
using SabreTools.Data.Models.OpenMSX;
namespace SabreTools.Serialization.Readers
@@ -163,7 +164,7 @@ namespace SabreTools.Serialization.Readers
{
var obj = new Original();
obj.Value = reader.GetAttribute("value");
obj.Value = reader.GetAttribute("value").AsYesNo();
obj.Content = reader.ReadElementContentAsString();
return obj;

View File

@@ -115,7 +115,7 @@ namespace SabreTools.Serialization.Writers
{
writer.WriteStartElement("original");
writer.WriteOptionalAttributeString("value", obj.Value);
writer.WriteOptionalAttributeString("value", obj.Value?.ToString().ToLowerInvariant());
if (obj.Content is not null)
writer.WriteRaw(obj.Content);