From ebf67d39cf31c7e50fe566396e90e92ad33b509c Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Sat, 4 Apr 2026 18:24:58 -0400 Subject: [PATCH] Lazily make OfflineList-specific header items properties --- .../MetadataExtensions.cs | 6 + SabreTools.Data.Models/Metadata/Header.cs | 45 +++----- .../DatFileTests.FromMetadata.cs | 24 ++-- .../DatFileTests.ToMetadata.cs | 31 +++-- .../DatHeaderTests.cs | 108 ------------------ .../DatFile.FromMetadata.cs | 24 ++-- SabreTools.Metadata.DatFiles/DatHeader.cs | 75 ++++++------ SabreTools.Metadata.Filter/FilterObject.cs | 8 ++ .../DictionaryBaseExtensions.cs | 8 ++ .../OfflineList.Deserializer.cs | 29 ++--- .../OfflineList.Serializer.cs | 14 +-- 11 files changed, 135 insertions(+), 237 deletions(-) diff --git a/SabreTools.Data.Extensions/MetadataExtensions.cs b/SabreTools.Data.Extensions/MetadataExtensions.cs index 4408dec5..12ca38bf 100644 --- a/SabreTools.Data.Extensions/MetadataExtensions.cs +++ b/SabreTools.Data.Extensions/MetadataExtensions.cs @@ -120,6 +120,7 @@ namespace SabreTools.Data.Extensions cloneHeader.Author = selfHeader.Author; cloneHeader.BiosMode = selfHeader.BiosMode; cloneHeader.Build = selfHeader.Build; + cloneHeader.CanOpen = selfHeader.CanOpen; cloneHeader.Category = selfHeader.Category; cloneHeader.Comment = selfHeader.Comment; cloneHeader.Date = selfHeader.Date; @@ -136,11 +137,15 @@ namespace SabreTools.Data.Extensions cloneHeader.HeaderSkipper = selfHeader.HeaderSkipper; cloneHeader.Homepage = selfHeader.Homepage; cloneHeader.Id = selfHeader.Id; + cloneHeader.Images = selfHeader.Images; + cloneHeader.ImFolder = selfHeader.ImFolder; + cloneHeader.Infos = selfHeader.Infos; cloneHeader.LockBiosMode = selfHeader.LockBiosMode; cloneHeader.LockRomMode = selfHeader.LockRomMode; cloneHeader.LockSampleMode = selfHeader.LockSampleMode; cloneHeader.MameConfig = selfHeader.MameConfig; cloneHeader.Name = selfHeader.Name; + cloneHeader.NewDat = selfHeader.NewDat; cloneHeader.Notes = selfHeader.Notes; cloneHeader.Plugin = selfHeader.Plugin; cloneHeader.RefName = selfHeader.RefName; @@ -150,6 +155,7 @@ namespace SabreTools.Data.Extensions cloneHeader.SampleMode = selfHeader.SampleMode; cloneHeader.ScreenshotsHeight = selfHeader.ScreenshotsHeight; cloneHeader.ScreenshotsWidth = selfHeader.ScreenshotsWidth; + cloneHeader.Search = selfHeader.Search; cloneHeader.System = selfHeader.System; cloneHeader.Timestamp = selfHeader.Timestamp; cloneHeader.Type = selfHeader.Type; diff --git a/SabreTools.Data.Models/Metadata/Header.cs b/SabreTools.Data.Models/Metadata/Header.cs index 72fae142..4933d094 100644 --- a/SabreTools.Data.Models/Metadata/Header.cs +++ b/SabreTools.Data.Models/Metadata/Header.cs @@ -15,6 +15,9 @@ namespace SabreTools.Data.Models.Metadata public string? Build { get; set; } + /// TODO: This needs an internal model OR mapping to fields + public OfflineList.CanOpen? CanOpen { get; set; } + public string? Category { get; set; } public string? Comment { get; set; } @@ -52,6 +55,14 @@ namespace SabreTools.Data.Models.Metadata public string? Id { get; set; } + /// TODO: This needs an internal model OR mapping to fields + public OfflineList.Images? Images { get; set; } + + public string? ImFolder { get; set; } + + /// TODO: This needs an internal model OR mapping to fields + public OfflineList.Infos? Infos { get; set; } + /// (yes|no) "no" public bool? LockBiosMode { get; set; } @@ -65,6 +76,9 @@ namespace SabreTools.Data.Models.Metadata public string? Name { get; set; } + /// TODO: This needs an internal model OR mapping to fields + public OfflineList.NewDat? NewDat { get; set; } + public string? Notes { get; set; } public string? Plugin { get; set; } @@ -85,6 +99,9 @@ namespace SabreTools.Data.Models.Metadata public string? ScreenshotsWidth { get; set; } + /// TODO: This needs an internal model OR mapping to fields + public OfflineList.Search? Search { get; set; } + public string? System { get; set; } public string? Timestamp { get; set; } @@ -99,37 +116,9 @@ namespace SabreTools.Data.Models.Metadata #region Keys - /// TODO: This needs an internal model OR mapping to fields - /// CanOpen - [NoFilter] - public const string CanOpenKey = "canOpen"; - - /// TODO: This needs an internal model OR mapping to fields - /// Images - [NoFilter] - public const string ImagesKey = "images"; - - /// string - public const string ImFolderKey = "imFolder"; - - /// TODO: This needs an internal model OR mapping to fields - /// Infos - [NoFilter] - public const string InfosKey = "infos"; - - /// TODO: This needs an internal model OR mapping to fields - /// NewDat - [NoFilter] - public const string NewDatKey = "newDat"; - /// string public const string SchemaLocationKey = "schemaLocation"; - /// TODO: This needs an internal model OR mapping to fields - /// Search - [NoFilter] - public const string SearchKey = "search"; - #endregion } } diff --git a/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs b/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs index 32af8243..89a7172e 100644 --- a/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs +++ b/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs @@ -202,7 +202,7 @@ namespace SabreTools.Metadata.DatFiles.Test Author = "author", BiosMode = Data.Models.Metadata.MergingFlag.Merged, Build = "build", - [Data.Models.Metadata.Header.CanOpenKey] = canOpen, + CanOpen = canOpen, Category = "category", Comment = "comment", Date = "date", @@ -219,15 +219,15 @@ namespace SabreTools.Metadata.DatFiles.Test HeaderSkipper = "header", Homepage = "homepage", Id = "id", - [Data.Models.Metadata.Header.ImagesKey] = images, - [Data.Models.Metadata.Header.ImFolderKey] = "imfolder", - [Data.Models.Metadata.Header.InfosKey] = infos, + Images = images, + ImFolder = "imfolder", + Infos = infos, LockBiosMode = true, LockRomMode = true, LockSampleMode = true, MameConfig = "mameconfig", Name = "name", - [Data.Models.Metadata.Header.NewDatKey] = newDat, + NewDat = newDat, Notes = "notes", Plugin = "plugin", RefName = "refname", @@ -238,7 +238,7 @@ namespace SabreTools.Metadata.DatFiles.Test [Data.Models.Metadata.Header.SchemaLocationKey] = "schemalocation", ScreenshotsHeight = "screenshotsheight", ScreenshotsWidth = "screenshotsWidth", - [Data.Models.Metadata.Header.SearchKey] = search, + Search = search, System = "system", Timestamp = "timestamp", Type = "type", @@ -1010,7 +1010,7 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.Equal("author", datHeader.Author); Assert.Equal(Data.Models.Metadata.MergingFlag.Merged, datHeader.BiosMode); Assert.Equal("build", datHeader.Build); - Assert.Equal("ext", datHeader.ReadString(Data.Models.Metadata.Header.CanOpenKey)); + Assert.NotNull(datHeader.CanOpen); Assert.Equal("category", datHeader.Category); Assert.Equal("comment", datHeader.Comment); Assert.Equal("date", datHeader.Date); @@ -1026,15 +1026,15 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.Equal("header", datHeader.HeaderSkipper); Assert.Equal("homepage", datHeader.Homepage); Assert.Equal("id", datHeader.Id); - Assert.NotNull(datHeader.ReadString(Data.Models.Metadata.Header.ImagesKey)); - Assert.Equal("imfolder", datHeader.ReadString(Data.Models.Metadata.Header.ImFolderKey)); - Assert.NotNull(datHeader.ReadString(Data.Models.Metadata.Header.InfosKey)); + Assert.NotNull(datHeader.Images); + Assert.Equal("imfolder", datHeader.ImFolder); + Assert.NotNull(datHeader.Infos); Assert.True(datHeader.LockBiosMode); Assert.True(datHeader.LockRomMode); Assert.True(datHeader.LockSampleMode); Assert.Equal("mameconfig", datHeader.MameConfig); Assert.Equal("name", datHeader.Name); - Assert.NotNull(datHeader.ReadString(Data.Models.Metadata.Header.NewDatKey)); + Assert.NotNull(datHeader.NewDat); Assert.Equal("notes", datHeader.Notes); Assert.Equal("plugin", datHeader.Plugin); Assert.Equal("refname", datHeader.RefName); @@ -1045,7 +1045,7 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.Equal("schemalocation", datHeader.ReadString(Data.Models.Metadata.Header.SchemaLocationKey)); Assert.Equal("screenshotsheight", datHeader.ScreenshotsHeight); Assert.Equal("screenshotsWidth", datHeader.ScreenshotsWidth); - Assert.NotNull(datHeader.ReadString(Data.Models.Metadata.Header.SearchKey)); + Assert.NotNull(datHeader.Search); 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 a8c224ef..7c643816 100644 --- a/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs +++ b/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs @@ -92,17 +92,14 @@ namespace SabreTools.Metadata.DatFiles.Test private static DatHeader CreateHeader() { - DatHeader item = new DatHeader(CreateMetadataHeader()); - - item.Write(Data.Models.Metadata.Header.CanOpenKey, ["ext"]); - item.Write(Data.Models.Metadata.Header.ImagesKey, - new Data.Models.OfflineList.Images() { Height = "height" }); - item.Write(Data.Models.Metadata.Header.InfosKey, - new Data.Models.OfflineList.Infos() { Comment = new Data.Models.OfflineList.Comment() }); - item.Write(Data.Models.Metadata.Header.NewDatKey, - new Data.Models.OfflineList.NewDat() { DatUrl = new Data.Models.OfflineList.DatUrl() }); - item.Write(Data.Models.Metadata.Header.SearchKey, - new Data.Models.OfflineList.Search() { To = [] }); + DatHeader item = new DatHeader(CreateMetadataHeader()) + { + CanOpen = new Data.Models.OfflineList.CanOpen { Extension = ["ext"] }, + Images = new Data.Models.OfflineList.Images() { Height = "height" }, + Infos = new Data.Models.OfflineList.Infos() { Comment = new Data.Models.OfflineList.Comment() }, + NewDat = new Data.Models.OfflineList.NewDat() { DatUrl = new Data.Models.OfflineList.DatUrl() }, + Search = new Data.Models.OfflineList.Search() { To = [] }, + }; return item; } @@ -354,7 +351,7 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.Equal("author", header.Author); Assert.Equal(Data.Models.Metadata.MergingFlag.Merged, header.BiosMode); Assert.Equal("build", header.Build); - Assert.NotNull(header.Read(Data.Models.Metadata.Header.CanOpenKey)); + Assert.NotNull(header.CanOpen); Assert.Equal("category", header.Category); Assert.Equal("comment", header.Comment); Assert.Equal("date", header.Date); @@ -370,15 +367,15 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.Equal("header", header.HeaderSkipper); Assert.Equal("homepage", header.Homepage); Assert.Equal("id", header.Id); - Assert.NotNull(header.Read(Data.Models.Metadata.Header.ImagesKey)); - Assert.Equal("imfolder", header.ReadString(Data.Models.Metadata.Header.ImFolderKey)); - Assert.NotNull(header.Read(Data.Models.Metadata.Header.InfosKey)); + Assert.NotNull(header.Images); + Assert.Equal("imfolder", header.ImFolder); + Assert.NotNull(header.Infos); Assert.True(header.LockBiosMode); Assert.True(header.LockRomMode); Assert.True(header.LockSampleMode); Assert.Equal("mameconfig", header.MameConfig); Assert.Equal("name", header.Name); - Assert.NotNull(header.Read(Data.Models.Metadata.Header.NewDatKey)); + Assert.NotNull(header.NewDat); Assert.Equal("notes", header.Notes); Assert.Equal("plugin", header.Plugin); Assert.Equal("refname", header.RefName); @@ -389,7 +386,7 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.Equal("schemalocation", header.ReadString(Data.Models.Metadata.Header.SchemaLocationKey)); Assert.Equal("screenshotsheight", header.ScreenshotsHeight); Assert.Equal("screenshotsWidth", header.ScreenshotsWidth); - Assert.NotNull(header.Read(Data.Models.Metadata.Header.SearchKey)); + Assert.NotNull(header.Search); Assert.Equal("system", header.System); Assert.Equal("timestamp", header.Timestamp); Assert.Equal("type", header.Type); diff --git a/SabreTools.Metadata.DatFiles.Test/DatHeaderTests.cs b/SabreTools.Metadata.DatFiles.Test/DatHeaderTests.cs index 18f669f0..e74cc055 100644 --- a/SabreTools.Metadata.DatFiles.Test/DatHeaderTests.cs +++ b/SabreTools.Metadata.DatFiles.Test/DatHeaderTests.cs @@ -4,114 +4,6 @@ namespace SabreTools.Metadata.DatFiles.Test { public class DatHeaderTests { - #region CanOpenSpecified - - [Fact] - public void CanOpenSpecified_Missing() - { - DatHeader header = new DatHeader(); - header.Write(Data.Models.Metadata.Header.CanOpenKey, null); - Assert.False(header.CanOpenSpecified); - } - - [Fact] - public void CanOpenSpecified_Empty() - { - DatHeader header = new DatHeader(); - header.Write(Data.Models.Metadata.Header.CanOpenKey, []); - Assert.False(header.CanOpenSpecified); - } - - [Fact] - public void CanOpenSpecified_Exists() - { - DatHeader header = new DatHeader(); - header.Write(Data.Models.Metadata.Header.CanOpenKey, ["value"]); - Assert.True(header.CanOpenSpecified); - } - - #endregion - - #region ImagesSpecified - - [Fact] - public void ImagesSpecified_Missing() - { - DatHeader header = new DatHeader(); - header.Write(Data.Models.Metadata.Header.ImagesKey, null); - Assert.False(header.ImagesSpecified); - } - - [Fact] - public void ImagesSpecified_Exists() - { - DatHeader header = new DatHeader(); - header.Write(Data.Models.Metadata.Header.ImagesKey, new()); - Assert.True(header.ImagesSpecified); - } - - #endregion - - #region InfosSpecified - - [Fact] - public void InfosSpecified_Missing() - { - DatHeader header = new DatHeader(); - header.Write(Data.Models.Metadata.Header.InfosKey, null); - Assert.False(header.InfosSpecified); - } - - [Fact] - public void InfosSpecified_Exists() - { - DatHeader header = new DatHeader(); - header.Write(Data.Models.Metadata.Header.InfosKey, new()); - Assert.True(header.InfosSpecified); - } - - #endregion - - #region NewDatSpecified - - [Fact] - public void NewDatSpecified_Missing() - { - DatHeader header = new DatHeader(); - header.Write(Data.Models.Metadata.Header.NewDatKey, null); - Assert.False(header.NewDatSpecified); - } - - [Fact] - public void NewDatSpecified_Exists() - { - DatHeader header = new DatHeader(); - header.Write(Data.Models.Metadata.Header.NewDatKey, new()); - Assert.True(header.NewDatSpecified); - } - - #endregion - - #region SearchSpecified - - [Fact] - public void SearchSpecified_Missing() - { - DatHeader header = new DatHeader(); - header.Write(Data.Models.Metadata.Header.SearchKey, null); - Assert.False(header.SearchSpecified); - } - - [Fact] - public void SearchSpecified_Exists() - { - DatHeader header = new DatHeader(); - header.Write(Data.Models.Metadata.Header.SearchKey, new()); - Assert.True(header.SearchSpecified); - } - - #endregion - #region Clone [Fact] diff --git a/SabreTools.Metadata.DatFiles/DatFile.FromMetadata.cs b/SabreTools.Metadata.DatFiles/DatFile.FromMetadata.cs index 9bf8ef40..0a67da5c 100644 --- a/SabreTools.Metadata.DatFiles/DatFile.FromMetadata.cs +++ b/SabreTools.Metadata.DatFiles/DatFile.FromMetadata.cs @@ -69,25 +69,25 @@ namespace SabreTools.Metadata.DatFiles Header.Name = header.Name; // Convert subheader values - var canOpen = item.Read(Data.Models.Metadata.Header.CanOpenKey); + var canOpen = item.CanOpen; if (canOpen?.Extension is not null) - Header.Write(Data.Models.Metadata.Header.CanOpenKey, canOpen.Extension); + Header.CanOpen = canOpen; - var images = item.Read(Data.Models.Metadata.Header.ImagesKey); + var images = item.Images; if (images is not null) - Header.Write(Data.Models.Metadata.Header.ImagesKey, images); + Header.Images = images; - var infos = item.Read(Data.Models.Metadata.Header.InfosKey); + var infos = item.Infos; if (infos is not null) - Header.Write(Data.Models.Metadata.Header.InfosKey, infos); + Header.Infos = infos; - var newDat = item.Read(Data.Models.Metadata.Header.NewDatKey); + var newDat = item.NewDat; if (newDat is not null) - Header.Write(Data.Models.Metadata.Header.NewDatKey, newDat); + Header.NewDat = newDat; - var search = item.Read(Data.Models.Metadata.Header.SearchKey); + var search = item.Search; if (search is not null) - Header.Write(Data.Models.Metadata.Header.SearchKey, search); + Header.Search = search; // Selectively set all possible fields -- TODO: Figure out how to make this less manual if (Header.Author is null) @@ -126,8 +126,8 @@ namespace SabreTools.Metadata.DatFiles Header.Homepage = header.Homepage; if (Header.Id is null) Header.Id = header.Id; - if (Header.ReadString(Data.Models.Metadata.Header.ImFolderKey) is null) - Header.Write(Data.Models.Metadata.Header.ImFolderKey, header.ReadString(Data.Models.Metadata.Header.ImFolderKey)); + if (Header.ImFolder is null) + Header.ImFolder = header.ImFolder; if (Header.LockBiosMode is null) Header.LockBiosMode = header.LockBiosMode; if (Header.LockRomMode is null) diff --git a/SabreTools.Metadata.DatFiles/DatHeader.cs b/SabreTools.Metadata.DatFiles/DatHeader.cs index 4f58cafb..1dffbde6 100644 --- a/SabreTools.Metadata.DatFiles/DatHeader.cs +++ b/SabreTools.Metadata.DatFiles/DatHeader.cs @@ -35,16 +35,15 @@ namespace SabreTools.Metadata.DatFiles set => _internal.Build = value; } - [JsonIgnore] - public bool CanOpenSpecified + public Data.Models.OfflineList.CanOpen? CanOpen { - get - { - var canOpen = ReadStringArray(Data.Models.Metadata.Header.CanOpenKey); - return canOpen is not null && canOpen.Length > 0; - } + get => _internal.CanOpen; + set => _internal.CanOpen = value; } + [JsonIgnore] + public bool CanOpenSpecified => CanOpen is not null; + public string? Category { get => _internal.Category; @@ -151,24 +150,30 @@ namespace SabreTools.Metadata.DatFiles set => _internal.Id = value; } - [JsonIgnore] - public bool ImagesSpecified + public Data.Models.OfflineList.Images? Images { - get - { - return Read(Data.Models.Metadata.Header.ImagesKey) is not null; - } + get => _internal.Images; + set => _internal.Images = value; } [JsonIgnore] - public bool InfosSpecified + public bool ImagesSpecified => Images is not null; + + public string? ImFolder { - get - { - return Read(Data.Models.Metadata.Header.InfosKey) is not null; - } + get => _internal.ImFolder; + set => _internal.ImFolder = value; } + public Data.Models.OfflineList.Infos? Infos + { + get => _internal.Infos; + set => _internal.Infos = value; + } + + [JsonIgnore] + public bool InfosSpecified => Infos is not null; + public bool? LockBiosMode { get => _internal.LockBiosMode; @@ -199,15 +204,15 @@ namespace SabreTools.Metadata.DatFiles set => _internal.Name = value; } - [JsonIgnore] - public bool NewDatSpecified + public Data.Models.OfflineList.NewDat? NewDat { - get - { - return Read(Data.Models.Metadata.Header.NewDatKey) is not null; - } + get => _internal.NewDat; + set => _internal.NewDat = value; } + [JsonIgnore] + public bool NewDatSpecified => NewDat is not null; + public string? Notes { get => _internal.Notes; @@ -262,15 +267,15 @@ namespace SabreTools.Metadata.DatFiles set => _internal.ScreenshotsWidth = value; } - [JsonIgnore] - public bool SearchSpecified + public Data.Models.OfflineList.Search? Search { - get - { - return Read(Data.Models.Metadata.Header.SearchKey) is not null; - } + get => _internal.Search; + set => _internal.Search = value; } + [JsonIgnore] + public bool SearchSpecified => Search is not null; + public string? System { get => _internal.System; @@ -346,15 +351,15 @@ namespace SabreTools.Metadata.DatFiles // Convert subheader values if (CanOpenSpecified) - header[Data.Models.Metadata.Header.CanOpenKey] = new Data.Models.OfflineList.CanOpen { Extension = ReadStringArray(Data.Models.Metadata.Header.CanOpenKey) }; + header.CanOpen = CanOpen; if (ImagesSpecified) - header[Data.Models.Metadata.Header.ImagesKey] = Read(Data.Models.Metadata.Header.ImagesKey); + header.Images = Images; if (InfosSpecified) - header[Data.Models.Metadata.Header.InfosKey] = Read(Data.Models.Metadata.Header.InfosKey); + header.Infos = Infos; if (NewDatSpecified) - header[Data.Models.Metadata.Header.NewDatKey] = Read(Data.Models.Metadata.Header.NewDatKey); + header.NewDat = NewDat; if (SearchSpecified) - header[Data.Models.Metadata.Header.SearchKey] = Read(Data.Models.Metadata.Header.SearchKey); + header.Search = Search; return header; } diff --git a/SabreTools.Metadata.Filter/FilterObject.cs b/SabreTools.Metadata.Filter/FilterObject.cs index 1d58d463..138c9798 100644 --- a/SabreTools.Metadata.Filter/FilterObject.cs +++ b/SabreTools.Metadata.Filter/FilterObject.cs @@ -777,6 +777,7 @@ namespace SabreTools.Metadata.Filter case Header item when fieldName == "build": checkValue = item.Build; return true; + // Header.CanOpen is intentionally skipped case Header item when fieldName == "category": checkValue = item.Category; return true; @@ -823,6 +824,11 @@ namespace SabreTools.Metadata.Filter case Header item when fieldName == "id": checkValue = item.Id; return true; + // Header.Images is intentionally skipped + case Header item when fieldName == "imfolder": + checkValue = item.ImFolder; + return true; + // Header.Infos is intentionally skipped case Header item when fieldName == "lockbiosmode": checkValue = item.LockBiosMode.FromYesNo(); return true; @@ -838,6 +844,7 @@ namespace SabreTools.Metadata.Filter case Header item when fieldName == "name": checkValue = item.Name; return true; + // Header.NewDat is intentionally skipped case Header item when fieldName == "notes": checkValue = item.Notes; return true; @@ -865,6 +872,7 @@ namespace SabreTools.Metadata.Filter case Header item when fieldName == "screenshotswidth": checkValue = item.ScreenshotsWidth; return true; + // Header.Search is intentionally skipped case Header item when fieldName == "system": checkValue = item.System; return true; diff --git a/SabreTools.Metadata/DictionaryBaseExtensions.cs b/SabreTools.Metadata/DictionaryBaseExtensions.cs index 5dff9136..15b784a8 100644 --- a/SabreTools.Metadata/DictionaryBaseExtensions.cs +++ b/SabreTools.Metadata/DictionaryBaseExtensions.cs @@ -180,6 +180,7 @@ namespace SabreTools.Metadata return false; if (selfHeader.Build != otherHeader.Build) return false; + // Header.CanOpen is intentionally skipped if (selfHeader.Category != otherHeader.Category) return false; if (selfHeader.Comment != otherHeader.Comment) @@ -206,10 +207,15 @@ namespace SabreTools.Metadata return false; if (selfHeader.HeaderSkipper != otherHeader.HeaderSkipper) return false; + // Header.HeaderRow is intentionally skipped if (selfHeader.Homepage != otherHeader.Homepage) return false; if (selfHeader.Id != otherHeader.Id) return false; + // Header.Images is intentionally skipped + if (selfHeader.ImFolder != otherHeader.ImFolder) + return false; + // Header.Infos is intentionally skipped if (selfHeader.LockBiosMode != otherHeader.LockBiosMode) return false; if (selfHeader.LockRomMode != otherHeader.LockRomMode) @@ -220,6 +226,7 @@ namespace SabreTools.Metadata return false; if (selfHeader.Name != otherHeader.Name) return false; + // Header.NewDat is intentionally skipped if (selfHeader.Notes != otherHeader.Notes) return false; if (selfHeader.Plugin != otherHeader.Plugin) @@ -238,6 +245,7 @@ namespace SabreTools.Metadata return false; if (selfHeader.ScreenshotsWidth != otherHeader.ScreenshotsWidth) return false; + // Header.Search is intentionally skipped if (selfHeader.System != otherHeader.System) return false; if (selfHeader.Timestamp != otherHeader.Timestamp) diff --git a/SabreTools.Serialization.CrossModel/OfflineList.Deserializer.cs b/SabreTools.Serialization.CrossModel/OfflineList.Deserializer.cs index d8b8fe37..f0348147 100644 --- a/SabreTools.Serialization.CrossModel/OfflineList.Deserializer.cs +++ b/SabreTools.Serialization.CrossModel/OfflineList.Deserializer.cs @@ -37,40 +37,35 @@ namespace SabreTools.Serialization.CrossModel }; if (item.Name is not null - || item.ContainsKey(Data.Models.Metadata.Header.ImFolderKey) + || item.ImFolder is not null || item.DatVersion is not null || item.System is not null || item.ScreenshotsHeight is not null || item.ScreenshotsWidth is not null - || item.ContainsKey(Data.Models.Metadata.Header.InfosKey) - || item.ContainsKey(Data.Models.Metadata.Header.CanOpenKey) - || item.ContainsKey(Data.Models.Metadata.Header.NewDatKey) - || item.ContainsKey(Data.Models.Metadata.Header.SearchKey) + || item.Infos is not null + || item.CanOpen is not null + || item.NewDat is not null + || item.Search is not null || item.RomTitle is not null) { dat.Configuration = new Configuration { DatName = item.Name, - ImFolder = item.ReadString(Data.Models.Metadata.Header.ImFolderKey), + ImFolder = item.ImFolder, DatVersion = item.DatVersion, System = item.System, ScreenshotsWidth = item.ScreenshotsHeight, ScreenshotsHeight = item.ScreenshotsWidth, - Infos = item.Read(Data.Models.Metadata.Header.InfosKey), - CanOpen = item.Read(Data.Models.Metadata.Header.CanOpenKey), - NewDat = item.Read(Data.Models.Metadata.Header.NewDatKey), - Search = item.Read(Data.Models.Metadata.Header.SearchKey), + Infos = item.Infos, + CanOpen = item.CanOpen, + NewDat = item.NewDat, + Search = item.Search, RomTitle = item.RomTitle, }; } - if (item.ContainsKey(Data.Models.Metadata.Header.ImagesKey)) - { - dat.GUI = new GUI - { - Images = item.Read(Data.Models.Metadata.Header.ImagesKey), - }; - } + if (item.Images is not null) + dat.GUI = new GUI { Images = item.Images }; return dat; } diff --git a/SabreTools.Serialization.CrossModel/OfflineList.Serializer.cs b/SabreTools.Serialization.CrossModel/OfflineList.Serializer.cs index 7a8dcf6c..a6e91ce9 100644 --- a/SabreTools.Serialization.CrossModel/OfflineList.Serializer.cs +++ b/SabreTools.Serialization.CrossModel/OfflineList.Serializer.cs @@ -38,22 +38,20 @@ namespace SabreTools.Serialization.CrossModel if (item.Configuration is not null) { header.Name = item.Configuration.DatName; - header[Data.Models.Metadata.Header.ImFolderKey] = item.Configuration.ImFolder; + header.ImFolder = item.Configuration.ImFolder; header.DatVersion = item.Configuration.DatVersion; header.System = item.Configuration.System; header.ScreenshotsHeight = item.Configuration.ScreenshotsWidth; header.ScreenshotsWidth = item.Configuration.ScreenshotsHeight; - header[Data.Models.Metadata.Header.InfosKey] = item.Configuration.Infos; - header[Data.Models.Metadata.Header.CanOpenKey] = item.Configuration.CanOpen; - header[Data.Models.Metadata.Header.NewDatKey] = item.Configuration.NewDat; - header[Data.Models.Metadata.Header.SearchKey] = item.Configuration.Search; + header.Infos = item.Configuration.Infos; + header.CanOpen = item.Configuration.CanOpen; + header.NewDat = item.Configuration.NewDat; + header.Search = item.Configuration.Search; header.RomTitle = item.Configuration.RomTitle; } if (item.GUI is not null) - { - header[Data.Models.Metadata.Header.ImagesKey] = item.GUI.Images; - } + header.Images = item.GUI.Images; return header; }