diff --git a/SabreTools.Data.Extensions/MetadataExtensions.cs b/SabreTools.Data.Extensions/MetadataExtensions.cs index 468b55f6..4408dec5 100644 --- a/SabreTools.Data.Extensions/MetadataExtensions.cs +++ b/SabreTools.Data.Extensions/MetadataExtensions.cs @@ -132,6 +132,8 @@ namespace SabreTools.Data.Extensions cloneHeader.ForceNodump = selfHeader.ForceNodump; cloneHeader.ForcePacking = selfHeader.ForcePacking; cloneHeader.ForceZipping = selfHeader.ForceZipping; + cloneHeader.HeaderRow = selfHeader.HeaderRow; + cloneHeader.HeaderSkipper = selfHeader.HeaderSkipper; cloneHeader.Homepage = selfHeader.Homepage; cloneHeader.Id = selfHeader.Id; cloneHeader.LockBiosMode = selfHeader.LockBiosMode; diff --git a/SabreTools.Data.Models/Metadata/Header.cs b/SabreTools.Data.Models/Metadata/Header.cs index c0b9c140..c0ef648a 100644 --- a/SabreTools.Data.Models/Metadata/Header.cs +++ b/SabreTools.Data.Models/Metadata/Header.cs @@ -44,6 +44,10 @@ namespace SabreTools.Data.Models.Metadata /// (yes|no) "yes" public bool? ForceZipping { get; set; } + public string[]? HeaderRow { get; set; } + + public string? HeaderSkipper { get; set; } + public string? Homepage { get; set; } public string? Id { get; set; } @@ -100,9 +104,6 @@ namespace SabreTools.Data.Models.Metadata [NoFilter] public const string CanOpenKey = "canOpen"; - /// string, string[] - public const string HeaderKey = "header"; - /// TODO: This needs an internal model OR mapping to fields /// Search [NoFilter] diff --git a/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs b/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs index 7596bf62..32af8243 100644 --- a/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs +++ b/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs @@ -215,7 +215,8 @@ namespace SabreTools.Metadata.DatFiles.Test ForceNodump = Data.Models.Metadata.NodumpFlag.Required, ForcePacking = Data.Models.Metadata.PackingFlag.Zip, ForceZipping = true, - [Data.Models.Metadata.Header.HeaderKey] = "header", + HeaderRow = ["header"], + HeaderSkipper = "header", Homepage = "homepage", Id = "id", [Data.Models.Metadata.Header.ImagesKey] = images, @@ -1022,7 +1023,7 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.Equal(Data.Models.Metadata.NodumpFlag.Required, datHeader.ForceNodump); Assert.Equal(Data.Models.Metadata.PackingFlag.Zip, datHeader.ForcePacking); Assert.True(datHeader.ForceZipping); - Assert.Equal("header", datHeader.ReadString(Data.Models.Metadata.Header.HeaderKey)); + Assert.Equal("header", datHeader.HeaderSkipper); Assert.Equal("homepage", datHeader.Homepage); Assert.Equal("id", datHeader.Id); Assert.NotNull(datHeader.ReadString(Data.Models.Metadata.Header.ImagesKey)); diff --git a/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs b/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs index 4835d4c8..a8c224ef 100644 --- a/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs +++ b/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs @@ -367,7 +367,7 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.Equal(Data.Models.Metadata.NodumpFlag.Required, header.ForceNodump); Assert.Equal(Data.Models.Metadata.PackingFlag.Zip, header.ForcePacking); Assert.True(header.ForceZipping); - Assert.Equal("header", header.ReadString(Data.Models.Metadata.Header.HeaderKey)); + Assert.Equal("header", header.HeaderSkipper); Assert.Equal("homepage", header.Homepage); Assert.Equal("id", header.Id); Assert.NotNull(header.Read(Data.Models.Metadata.Header.ImagesKey)); @@ -395,6 +395,11 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.Equal("type", header.Type); Assert.Equal("url", header.Url); Assert.Equal("version", header.Version); + + string[]? headerRowTitles = header.HeaderRow; + Assert.NotNull(headerRowTitles); + string? headerRowTitle = Assert.Single(headerRowTitles); + Assert.Equal("header", headerRowTitle); } private static void ValidateMetadataMachine(Data.Models.Metadata.Machine machine) diff --git a/SabreTools.Metadata.DatFiles/DatFile.FromMetadata.cs b/SabreTools.Metadata.DatFiles/DatFile.FromMetadata.cs index d47b7517..9bf8ef40 100644 --- a/SabreTools.Metadata.DatFiles/DatFile.FromMetadata.cs +++ b/SabreTools.Metadata.DatFiles/DatFile.FromMetadata.cs @@ -120,8 +120,8 @@ namespace SabreTools.Metadata.DatFiles Header.ForcePacking = header.ForcePacking; if (Header.ForceZipping is null) Header.ForceZipping = header.ForceZipping; - if (Header.ReadString(Data.Models.Metadata.Header.HeaderKey) is null) - Header.Write(Data.Models.Metadata.Header.HeaderKey, header.ReadString(Data.Models.Metadata.Header.HeaderKey)); + if (Header.HeaderSkipper is null) + Header.HeaderSkipper = header.HeaderSkipper; if (Header.Homepage is null) Header.Homepage = header.Homepage; if (Header.Id is null) diff --git a/SabreTools.Metadata.DatFiles/DatHeader.cs b/SabreTools.Metadata.DatFiles/DatHeader.cs index 0d5c4704..4f58cafb 100644 --- a/SabreTools.Metadata.DatFiles/DatHeader.cs +++ b/SabreTools.Metadata.DatFiles/DatHeader.cs @@ -127,6 +127,18 @@ namespace SabreTools.Metadata.DatFiles set => _internal.ForceZipping = value; } + public string[]? HeaderRow + { + get => _internal.HeaderRow; + set => _internal.HeaderRow = value; + } + + public string? HeaderSkipper + { + get => _internal.HeaderSkipper; + set => _internal.HeaderSkipper = value; + } + public string? Homepage { get => _internal.Homepage; diff --git a/SabreTools.Metadata.Filter/FilterObject.cs b/SabreTools.Metadata.Filter/FilterObject.cs index 26511e95..1d58d463 100644 --- a/SabreTools.Metadata.Filter/FilterObject.cs +++ b/SabreTools.Metadata.Filter/FilterObject.cs @@ -813,6 +813,10 @@ namespace SabreTools.Metadata.Filter case Header item when fieldName == "forcezipping": checkValue = item.ForceZipping.FromYesNo(); return true; + // Header.HeaderRow is intentionally skipped + case Header item when fieldName == "header" || fieldName == "headerskipper" || fieldName == "skipper": + checkValue = item.HeaderSkipper; + return true; case Header item when fieldName == "homepage": checkValue = item.Homepage; return true; diff --git a/SabreTools.Metadata/DictionaryBaseExtensions.cs b/SabreTools.Metadata/DictionaryBaseExtensions.cs index ccf77fa3..5dff9136 100644 --- a/SabreTools.Metadata/DictionaryBaseExtensions.cs +++ b/SabreTools.Metadata/DictionaryBaseExtensions.cs @@ -204,6 +204,8 @@ namespace SabreTools.Metadata return false; if (selfHeader.ForceZipping != otherHeader.ForceZipping) return false; + if (selfHeader.HeaderSkipper != otherHeader.HeaderSkipper) + return false; if (selfHeader.Homepage != otherHeader.Homepage) return false; if (selfHeader.Id != otherHeader.Id) diff --git a/SabreTools.Serialization.CrossModel/AttractMode.Deserializer.cs b/SabreTools.Serialization.CrossModel/AttractMode.Deserializer.cs index c944385a..83db08db 100644 --- a/SabreTools.Serialization.CrossModel/AttractMode.Deserializer.cs +++ b/SabreTools.Serialization.CrossModel/AttractMode.Deserializer.cs @@ -33,7 +33,7 @@ namespace SabreTools.Serialization.CrossModel { var metadataFile = new MetadataFile { - Header = item.ReadStringArray(Data.Models.Metadata.Header.HeaderKey), + Header = item.HeaderRow, }; return metadataFile; } diff --git a/SabreTools.Serialization.CrossModel/AttractMode.Serializer.cs b/SabreTools.Serialization.CrossModel/AttractMode.Serializer.cs index d6552156..db50c734 100644 --- a/SabreTools.Serialization.CrossModel/AttractMode.Serializer.cs +++ b/SabreTools.Serialization.CrossModel/AttractMode.Serializer.cs @@ -32,7 +32,7 @@ namespace SabreTools.Serialization.CrossModel { var header = new Data.Models.Metadata.Header { - [Data.Models.Metadata.Header.HeaderKey] = item.Header, + HeaderRow = item.Header, }; return header; } diff --git a/SabreTools.Serialization.CrossModel/ClrMamePro.Deserializer.cs b/SabreTools.Serialization.CrossModel/ClrMamePro.Deserializer.cs index baad81f6..f4f87052 100644 --- a/SabreTools.Serialization.CrossModel/ClrMamePro.Deserializer.cs +++ b/SabreTools.Serialization.CrossModel/ClrMamePro.Deserializer.cs @@ -53,7 +53,7 @@ namespace SabreTools.Serialization.CrossModel Homepage = item.Homepage, Url = item.Url, Comment = item.Comment, - Header = item.ReadString(Data.Models.Metadata.Header.HeaderKey), + Header = item.HeaderSkipper, Type = item.Type, ForceMerging = item.ForceMerging, ForceZipping = item.ForceZipping, diff --git a/SabreTools.Serialization.CrossModel/ClrMamePro.Serializer.cs b/SabreTools.Serialization.CrossModel/ClrMamePro.Serializer.cs index e86a4523..ba6663f2 100644 --- a/SabreTools.Serialization.CrossModel/ClrMamePro.Serializer.cs +++ b/SabreTools.Serialization.CrossModel/ClrMamePro.Serializer.cs @@ -45,7 +45,7 @@ namespace SabreTools.Serialization.CrossModel Homepage = item.Homepage, Url = item.Url, Comment = item.Comment, - [Data.Models.Metadata.Header.HeaderKey] = item.Header, + HeaderSkipper = item.Header, Type = item.Type, ForceMerging = item.ForceMerging, ForceZipping = item.ForceZipping, diff --git a/SabreTools.Serialization.CrossModel/Logiqx.Deserializer.cs b/SabreTools.Serialization.CrossModel/Logiqx.Deserializer.cs index bd08976b..7bf85575 100644 --- a/SabreTools.Serialization.CrossModel/Logiqx.Deserializer.cs +++ b/SabreTools.Serialization.CrossModel/Logiqx.Deserializer.cs @@ -56,16 +56,14 @@ namespace SabreTools.Serialization.CrossModel Type = item.Type, }; - string? headerVal = item.ReadString(Data.Models.Metadata.Header.HeaderKey); - - if (headerVal is not null + if (item.HeaderSkipper is not null || item.ForceMerging is not Data.Models.Metadata.MergingFlag.None || item.ForceNodump is not Data.Models.Metadata.NodumpFlag.None || item.ForcePacking is not Data.Models.Metadata.PackingFlag.None) { header.ClrMamePro = new Data.Models.Logiqx.ClrMamePro(); - if (headerVal is not null) - header.ClrMamePro.Header = headerVal; + if (item.HeaderSkipper is not null) + header.ClrMamePro.Header = item.HeaderSkipper; if (item.ForceMerging is not Data.Models.Metadata.MergingFlag.None) header.ClrMamePro.ForceMerging = item.ForceMerging; if (item.ForceNodump is not Data.Models.Metadata.NodumpFlag.None) diff --git a/SabreTools.Serialization.CrossModel/Logiqx.Serializer.cs b/SabreTools.Serialization.CrossModel/Logiqx.Serializer.cs index 171d0ad3..97ce3a76 100644 --- a/SabreTools.Serialization.CrossModel/Logiqx.Serializer.cs +++ b/SabreTools.Serialization.CrossModel/Logiqx.Serializer.cs @@ -70,7 +70,7 @@ namespace SabreTools.Serialization.CrossModel if (item.ClrMamePro is not null) { - header[Data.Models.Metadata.Header.HeaderKey] = item.ClrMamePro.Header; + header.HeaderSkipper = item.ClrMamePro.Header; header.ForceMerging = item.ClrMamePro.ForceMerging; header.ForceNodump = item.ClrMamePro.ForceNodump; header.ForcePacking = item.ClrMamePro.ForcePacking; diff --git a/SabreTools.Serialization.CrossModel/SeparatedValue.Deserializer.cs b/SabreTools.Serialization.CrossModel/SeparatedValue.Deserializer.cs index 1b339120..5a261aa7 100644 --- a/SabreTools.Serialization.CrossModel/SeparatedValue.Deserializer.cs +++ b/SabreTools.Serialization.CrossModel/SeparatedValue.Deserializer.cs @@ -33,7 +33,7 @@ namespace SabreTools.Serialization.CrossModel { var metadataFile = new MetadataFile { - Header = item.ReadStringArray(Data.Models.Metadata.Header.HeaderKey), + Header = item.HeaderRow, }; return metadataFile; } diff --git a/SabreTools.Serialization.CrossModel/SeparatedValue.Serializer.cs b/SabreTools.Serialization.CrossModel/SeparatedValue.Serializer.cs index bd8c1729..23e53f73 100644 --- a/SabreTools.Serialization.CrossModel/SeparatedValue.Serializer.cs +++ b/SabreTools.Serialization.CrossModel/SeparatedValue.Serializer.cs @@ -32,7 +32,7 @@ namespace SabreTools.Serialization.CrossModel { var header = new Data.Models.Metadata.Header { - [Data.Models.Metadata.Header.HeaderKey] = item.Header, + HeaderRow = item.Header, }; if (item.Row is not null && item.Row.Length > 0)