diff --git a/SabreTools.Data.Models/Logiqx/Header.cs b/SabreTools.Data.Models/Logiqx/Header.cs index 504615e9..9486d04e 100644 --- a/SabreTools.Data.Models/Logiqx/Header.cs +++ b/SabreTools.Data.Models/Logiqx/Header.cs @@ -48,6 +48,10 @@ namespace SabreTools.Data.Models.Logiqx [XmlElement("comment")] public string? Comment { get; set; } + /// RomVault extension + [XmlElement("subset")] + public string? Subset { get; set; } + /// Trurip extension [XmlElement("type")] public string? Type { get; set; } diff --git a/SabreTools.Data.Models/Metadata/Header.cs b/SabreTools.Data.Models/Metadata/Header.cs index eca5505d..e81449a5 100644 --- a/SabreTools.Data.Models/Metadata/Header.cs +++ b/SabreTools.Data.Models/Metadata/Header.cs @@ -108,6 +108,8 @@ namespace SabreTools.Data.Models.Metadata /// TODO: This needs an internal model OR mapping to fields public OfflineList.Search? Search { get; set; } + public string? Subset { get; set; } + public string? System { get; set; } public string? Timestamp { get; set; } @@ -166,6 +168,7 @@ namespace SabreTools.Data.Models.Metadata obj.ScreenshotsHeight = ScreenshotsHeight; obj.ScreenshotsWidth = ScreenshotsWidth; obj.Search = Search; + obj.Subset = Subset; obj.System = System; obj.Timestamp = Timestamp; obj.Type = Type; @@ -336,6 +339,11 @@ namespace SabreTools.Data.Models.Metadata else if (ScreenshotsWidth is not null && !ScreenshotsWidth.Equals(other.ScreenshotsWidth, StringComparison.OrdinalIgnoreCase)) return false; + if ((Subset is null) ^ (other.Subset is null)) + return false; + else if (Subset is not null && !Subset.Equals(other.Subset, StringComparison.OrdinalIgnoreCase)) + return false; + if ((System is null) ^ (other.System is null)) return false; else if (System is not null && !System.Equals(other.System, StringComparison.OrdinalIgnoreCase)) diff --git a/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs b/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs index 7ff69af3..dab4a214 100644 --- a/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs +++ b/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs @@ -243,6 +243,7 @@ namespace SabreTools.Metadata.DatFiles.Test ScreenshotsHeight = "screenshotsheight", ScreenshotsWidth = "screenshotsWidth", Search = search, + Subset = "subset", System = "system", Timestamp = "timestamp", Type = "type", @@ -1034,6 +1035,7 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.Equal("screenshotsheight", datHeader.ScreenshotsHeight); Assert.Equal("screenshotsWidth", datHeader.ScreenshotsWidth); Assert.NotNull(datHeader.Search); + Assert.Equal("subset", datHeader.Subset); Assert.Equal("system", datHeader.System); Assert.Equal("timestamp", datHeader.Timestamp); Assert.Equal("type", datHeader.Type); diff --git a/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs b/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs index c6e4bdd0..06bad6ae 100644 --- a/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs +++ b/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs @@ -374,6 +374,7 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.Equal("screenshotsheight", header.ScreenshotsHeight); Assert.Equal("screenshotsWidth", header.ScreenshotsWidth); Assert.NotNull(header.Search); + Assert.Equal("subset", header.Subset); Assert.Equal("system", header.System); Assert.Equal("timestamp", header.Timestamp); Assert.Equal("type", header.Type); diff --git a/SabreTools.Metadata.DatFiles/DatFile.FromMetadata.cs b/SabreTools.Metadata.DatFiles/DatFile.FromMetadata.cs index f97f9764..33e7fbbc 100644 --- a/SabreTools.Metadata.DatFiles/DatFile.FromMetadata.cs +++ b/SabreTools.Metadata.DatFiles/DatFile.FromMetadata.cs @@ -156,6 +156,8 @@ namespace SabreTools.Metadata.DatFiles Header.ScreenshotsWidth = header.ScreenshotsWidth; if (Header.System is null) Header.System = header.System; + if (Header.Subset is null) + Header.Subset = header.Subset; if (Header.Timestamp is null) Header.Timestamp = header.Timestamp; if (Header.Type is null) diff --git a/SabreTools.Metadata.DatFiles/DatHeader.cs b/SabreTools.Metadata.DatFiles/DatHeader.cs index 9a9ffe06..3365e02d 100644 --- a/SabreTools.Metadata.DatFiles/DatHeader.cs +++ b/SabreTools.Metadata.DatFiles/DatHeader.cs @@ -282,6 +282,12 @@ namespace SabreTools.Metadata.DatFiles [JsonIgnore] public bool SearchSpecified => Search is not null; + public string? Subset + { + get => _internal.Subset; + set => _internal.Subset = value; + } + public string? System { get => _internal.System; diff --git a/SabreTools.Metadata.Filter.Test/FilterObjectTests.cs b/SabreTools.Metadata.Filter.Test/FilterObjectTests.cs index 6d3dc128..40c2b8ce 100644 --- a/SabreTools.Metadata.Filter.Test/FilterObjectTests.cs +++ b/SabreTools.Metadata.Filter.Test/FilterObjectTests.cs @@ -1131,6 +1131,7 @@ namespace SabreTools.Metadata.Filter.Test [InlineData("header.schemalocation", "schemalocation")] [InlineData("header.screenshotsheight", "screenshotsheight")] [InlineData("header.screenshotswidth", "screenshotswidth")] + [InlineData("header.subset", "subset")] [InlineData("header.system", "system")] [InlineData("header.timestamp", "timestamp")] [InlineData("header.type", "type")] @@ -1176,6 +1177,7 @@ namespace SabreTools.Metadata.Filter.Test SchemaLocation = "schemalocation", ScreenshotsHeight = "screenshotsheight", ScreenshotsWidth = "screenshotswidth", + Subset = "subset", System = "system", Timestamp = "timestamp", Type = "type", diff --git a/SabreTools.Metadata.Filter/Constants.cs b/SabreTools.Metadata.Filter/Constants.cs index 12b61cee..db1e0dac 100644 --- a/SabreTools.Metadata.Filter/Constants.cs +++ b/SabreTools.Metadata.Filter/Constants.cs @@ -337,6 +337,7 @@ namespace SabreTools.Metadata.Filter "screenshotsheight", "screenshotswidth", "skipper", + "subset", "system", "timestamp", "type", diff --git a/SabreTools.Metadata.Filter/FilterObject.cs b/SabreTools.Metadata.Filter/FilterObject.cs index 60f1ebd5..3a7ec777 100644 --- a/SabreTools.Metadata.Filter/FilterObject.cs +++ b/SabreTools.Metadata.Filter/FilterObject.cs @@ -1365,6 +1365,9 @@ namespace SabreTools.Metadata.Filter checkValue = obj.ScreenshotsWidth; return true; // Header.Search is intentionally skipped + case "subset": + checkValue = obj.Subset; + return true; case "system": checkValue = obj.System; return true; diff --git a/SabreTools.Serialization.CrossModel.Test/LogiqxTests.cs b/SabreTools.Serialization.CrossModel.Test/LogiqxTests.cs index 31f6f149..4ef1b633 100644 --- a/SabreTools.Serialization.CrossModel.Test/LogiqxTests.cs +++ b/SabreTools.Serialization.CrossModel.Test/LogiqxTests.cs @@ -115,6 +115,7 @@ namespace SabreTools.Serialization.CrossModel.Test Url = "url", Comment = "comment", Type = "type", + Subset = "subset", RomVault = romvault, ClrMamePro = clrmamepro, RomCenter = romcenter, @@ -315,6 +316,7 @@ namespace SabreTools.Serialization.CrossModel.Test Assert.Equal("url", header.Url); Assert.Equal("comment", header.Comment); Assert.Equal("type", header.Type); + Assert.Equal("subset", header.Subset); Validate(header.RomVault); Validate(header.ClrMamePro); Validate(header.RomCenter); diff --git a/SabreTools.Serialization.CrossModel/Logiqx.Deserializer.cs b/SabreTools.Serialization.CrossModel/Logiqx.Deserializer.cs index d519e429..971d1b79 100644 --- a/SabreTools.Serialization.CrossModel/Logiqx.Deserializer.cs +++ b/SabreTools.Serialization.CrossModel/Logiqx.Deserializer.cs @@ -54,6 +54,7 @@ namespace SabreTools.Serialization.CrossModel Url = item.Url, Comment = item.Comment, Type = item.Type, + Subset = item.Subset, }; if (item.HeaderSkipper is not null diff --git a/SabreTools.Serialization.CrossModel/Logiqx.Serializer.cs b/SabreTools.Serialization.CrossModel/Logiqx.Serializer.cs index 5fcad906..47109752 100644 --- a/SabreTools.Serialization.CrossModel/Logiqx.Serializer.cs +++ b/SabreTools.Serialization.CrossModel/Logiqx.Serializer.cs @@ -66,6 +66,7 @@ namespace SabreTools.Serialization.CrossModel Url = item.Url, Comment = item.Comment, Type = item.Type, + Subset = item.Subset, }; if (item.ClrMamePro is not null) diff --git a/SabreTools.Serialization.Readers.Test/LogiqxTests.cs b/SabreTools.Serialization.Readers.Test/LogiqxTests.cs index bcce142b..801902b8 100644 --- a/SabreTools.Serialization.Readers.Test/LogiqxTests.cs +++ b/SabreTools.Serialization.Readers.Test/LogiqxTests.cs @@ -180,6 +180,7 @@ namespace SabreTools.Serialization.Readers.Test Url = "url", Comment = "comment", Type = "type", + Subset = "subset", RomVault = romvault, ClrMamePro = clrmamepro, RomCenter = romcenter, @@ -368,6 +369,7 @@ namespace SabreTools.Serialization.Readers.Test Assert.Equal("url", header.Url); Assert.Equal("comment", header.Comment); Assert.Equal("type", header.Type); + Assert.Equal("subset", header.Subset); Validate(header.RomVault); Validate(header.ClrMamePro); Validate(header.RomCenter); diff --git a/SabreTools.Serialization.Readers/Logiqx.cs b/SabreTools.Serialization.Readers/Logiqx.cs index f1924f8d..90cef509 100644 --- a/SabreTools.Serialization.Readers/Logiqx.cs +++ b/SabreTools.Serialization.Readers/Logiqx.cs @@ -270,6 +270,12 @@ namespace SabreTools.Serialization.Readers obj.Type = reader.ReadElementContentAsString(); break; + case "subset": + if (obj.Subset is not null && Debug) + Console.WriteLine($"'{reader.Name}' element already found, overwriting"); + + obj.Subset = reader.ReadElementContentAsString(); + break; case "romvault": if (obj.RomVault is not null && Debug) Console.WriteLine($"'{reader.Name}' element already found, overwriting"); diff --git a/SabreTools.Serialization.Writers/Logiqx.cs b/SabreTools.Serialization.Writers/Logiqx.cs index fcd9d6cc..05960e04 100644 --- a/SabreTools.Serialization.Writers/Logiqx.cs +++ b/SabreTools.Serialization.Writers/Logiqx.cs @@ -158,6 +158,7 @@ namespace SabreTools.Serialization.Writers writer.WriteOptionalElementString("url", obj.Url); writer.WriteOptionalElementString("comment", obj.Comment); writer.WriteOptionalElementString("type", obj.Type); + writer.WriteOptionalElementString("subset", obj.Subset); if (obj.RomVault is not null) WriteRomVault(obj.RomVault, writer);