diff --git a/SabreTools.Core/Enums.cs b/SabreTools.Core/Enums.cs index 03f4c289..da0c49fd 100644 --- a/SabreTools.Core/Enums.cs +++ b/SabreTools.Core/Enums.cs @@ -1404,169 +1404,6 @@ namespace SabreTools.Core Writable, } - /// - /// List of valid field types within a Machine - /// - public enum MachineField - { - /// - /// This is a fake flag that is used for filter only - /// - NULL = 0, - - /// Used in Logiqx - [Mapping("board")] - Board, - - /// Used in AttractMode - [Mapping("buttons")] - Buttons, - - /// Used in AttractMode, ClrMamePro, and Logiqx - [Mapping("category")] - Category, - - /// Used in AttractMode, ClrMamePro, ListXML, Logiqx, OfflineList, RomCenter, and Software List - [Mapping("cloneof", "clone_of")] - CloneOf, - - /// Used in Logiqx - [Mapping("cloneofid", "nointrocloneofid", "nointro_cloneofid", "no_intro_cloneofid", "no_intro_clone_of_id")] - CloneOfID, - - /// Used in AttractMode, Logiqx, and OfflineList; "extra" is used with AttractMode - [Mapping("comment", "extra")] - Comment, - - /// Used in AttractMode - [Mapping("control")] - Control, - - /// Used in OpenMSX - [Mapping("country")] - Country, - - /// Used in Logiqx (EmuArc Extension) - [Mapping("crc", "hascrc", "has_crc")] - CRC, - - /// Used in ArchiveDotOrg, AttractMode, ClrMamePro, DOSCenter, Everdrive SMDB, ListXML, Logiqx, RomCenter, Separated Value, and Software List - [Mapping("desc", "description")] - Description, - - /// Used in Logiqx (EmuArc Extension) - [Mapping("developer")] - Developer, - - /// Used in AttractMode - [Mapping("displaycount", "display_count")] - DisplayCount, - - /// Used in AttractMode - [Mapping("displaytype", "display_type")] - DisplayType, - - /// Used in Logiqx (EmuArc Extension) - [Mapping("enabled")] - Enabled, - - /// Used in OpenMSX - [Mapping("genmsxid", "genmsx_id", "gen_msxid", "gen_msx_id")] - GenMSXID, - - /// Used in Logiqx (EmuArc Extension) - [Mapping("genre")] - Genre, - - /// Used in ListXML - [Mapping("history")] - History, - - /// Used in Logiqx - [Mapping("id", "nointroid", "nointro_id", "no_intro_id")] - ID, - - /// Used in AttractMode, ClrMamePro, ListXML, Logiqx, and OpenMSX - [Mapping("manufacturer")] - Manufacturer, - - /// Used in ArchiveDotOrg, AttractMode, ClrMamePro, DOSCenter, Everdrive SMDB, Hashfile, ListROM, ListXML, Logiqx, Missfile, OfflineList, OpenMSX, RomCenter, Separated Value, and Software List - [Mapping("name")] - Name, - - /// Used in AttractMode and Logiqx - [Mapping("players")] - Players, - - /// Used in Logiqx, OfflineList, and Software List - [Mapping("publisher")] - Publisher, - - /// Used in Logiqx (EmuArc Extension) - [Mapping("ratings")] - Ratings, - - /// Used in Logiqx - [Mapping("rebuildto", "rebuild_to")] - RebuildTo, - - /// Used in Logiqx (EmuArc Extension) - [Mapping("relatedto", "related_to")] - RelatedTo, - - /// Used in ClrMamePro, ListXML, Logiqx, and RomCenter - [Mapping("romof", "rom_of")] - RomOf, - - /// Used in AttractMode - [Mapping("rotation")] - Rotation, - - /// Used in ListXML and Logiqx - [Mapping("runnable")] - Runnable, - - /// Used in ClrMamePro, ListXML, and Logiqx - [Mapping("sampleof", "sample_of")] - SampleOf, - - /// Used in Logiqx (EmuArc Extension) - [Mapping("score")] - Score, - - /// Used in ListXML and Logiqx - [Mapping("sourcefile", "source_file")] - SourceFile, - - /// Used in AttractMode - [Mapping("amstatus", "am_status", "gamestatus", "supportstatus", "support_status")] - Status, - - /// Used in Logiqx (EmuArc Extension) - [Mapping("subgenre", "sub_genre")] - Subgenre, - - /// Used in Software List - [Mapping("supported")] - Supported, - - /// Used in OpenMSX - [Mapping("system", "msxsystem", "msx_system")] - System, - - /// Used in Logiqx (EmuArc Extension) - [Mapping("titleid", "title_id")] - TitleID, - - /// Used in ClrMamePro, DOSCenter, ListXML, and Logiqx - [Mapping("type")] - Type, - - /// Used in AttractMode, ClrMamePro, ListXML, Logiqx, OpenMSX, and Software List - [Mapping("year")] - Year, - } - #endregion #region Logging diff --git a/SabreTools.Core/Tools/Converters.cs b/SabreTools.Core/Tools/Converters.cs index 184fe2ea..f9156690 100644 --- a/SabreTools.Core/Tools/Converters.cs +++ b/SabreTools.Core/Tools/Converters.cs @@ -69,36 +69,6 @@ namespace SabreTools.Core.Tools return AsEnumValue(itemInput); } - /// - /// Get MachineField value from input string - /// - /// String to get value from - /// MachineField value corresponding to the string - public static MachineField AsMachineField(this string? input) - { - // If the input is empty, we return null - if (string.IsNullOrEmpty(input)) - return MachineField.NULL; - - // Normalize the input - input = input!.ToLowerInvariant(); - - // Create regex - string machineRegex = @"^(game|machine)[.\-_\s]"; - - // If we don't have a machine field, skip - if (!Regex.IsMatch(input, machineRegex)) - return MachineField.NULL; - - // Replace the match and re-normalize - string machineInput = Regex.Replace(input, machineRegex, string.Empty) - .Replace(' ', '_') - .Replace('-', '_') - .Replace('.', '_'); - - return AsEnumValue(machineInput); - } - /// /// Get bool? value from input string /// diff --git a/SabreTools.Test/Core/ConvertersTests.cs b/SabreTools.Test/Core/ConvertersTests.cs index e7a4003c..0a2c45df 100644 --- a/SabreTools.Test/Core/ConvertersTests.cs +++ b/SabreTools.Test/Core/ConvertersTests.cs @@ -279,101 +279,6 @@ namespace SabreTools.Test.Core Assert.Equal(expected, actual); } - [Theory] - [InlineData(null, MachineField.NULL)] - [InlineData("name", MachineField.NULL)] - [InlineData("game-name", MachineField.Name)] - [InlineData("game.name", MachineField.Name)] - [InlineData("game_name", MachineField.Name)] - [InlineData("game name", MachineField.Name)] - [InlineData("machine-name", MachineField.Name)] - [InlineData("machine.name", MachineField.Name)] - [InlineData("machine_name", MachineField.Name)] - [InlineData("machine name", MachineField.Name)] - [InlineData("GAME.NAME", MachineField.Name)] - [InlineData("gAmE.namE", MachineField.Name)] - public void AsMachineFieldProcessingTest(string? field, MachineField expected) - { - MachineField actual = field.AsMachineField(); - Assert.Equal(expected, actual); - } - - [Theory] - [InlineData(null, MachineField.NULL)] - [InlineData("game.board", MachineField.Board)] - [InlineData("game.buttons", MachineField.Buttons)] - [InlineData("game.category", MachineField.Category)] - [InlineData("game.cloneof", MachineField.CloneOf)] - [InlineData("game.clone_of", MachineField.CloneOf)] - [InlineData("game.cloneofid", MachineField.CloneOfID)] - [InlineData("game.nointrocloneofid", MachineField.CloneOfID)] - [InlineData("game.nointro_cloneofid", MachineField.CloneOfID)] - [InlineData("game.no_intro_cloneofid", MachineField.CloneOfID)] - [InlineData("game.no_intro_clone_of_id", MachineField.CloneOfID)] - [InlineData("game.comment", MachineField.Comment)] - [InlineData("game.extra", MachineField.Comment)] - [InlineData("game.control", MachineField.Control)] - [InlineData("game.country", MachineField.Country)] - [InlineData("game.crc", MachineField.CRC)] - [InlineData("game.hascrc", MachineField.CRC)] - [InlineData("game.has_crc", MachineField.CRC)] - [InlineData("game.desc", MachineField.Description)] - [InlineData("game.description", MachineField.Description)] - [InlineData("game.developer", MachineField.Developer)] - [InlineData("game.displaycount", MachineField.DisplayCount)] - [InlineData("game.display_count", MachineField.DisplayCount)] - [InlineData("game.displaytype", MachineField.DisplayType)] - [InlineData("game.display_type", MachineField.DisplayType)] - [InlineData("game.enabled", MachineField.Enabled)] - [InlineData("game.genmsxid", MachineField.GenMSXID)] - [InlineData("game.genmsx_id", MachineField.GenMSXID)] - [InlineData("game.gen_msxid", MachineField.GenMSXID)] - [InlineData("game.gen_msx_id", MachineField.GenMSXID)] - [InlineData("game.genre", MachineField.Genre)] - [InlineData("game.history", MachineField.History)] - [InlineData("game.id", MachineField.ID)] - [InlineData("game.nointroid", MachineField.ID)] - [InlineData("game.nointro_id", MachineField.ID)] - [InlineData("game.no_intro_id", MachineField.ID)] - [InlineData("game.manufacturer", MachineField.Manufacturer)] - [InlineData("game.name", MachineField.Name)] - [InlineData("game.players", MachineField.Players)] - [InlineData("game.publisher", MachineField.Publisher)] - [InlineData("game.ratings", MachineField.Ratings)] - [InlineData("game.rebuildto", MachineField.RebuildTo)] - [InlineData("game.rebuild_to", MachineField.RebuildTo)] - [InlineData("game.relatedto", MachineField.RelatedTo)] - [InlineData("game.related_to", MachineField.RelatedTo)] - [InlineData("game.romof", MachineField.RomOf)] - [InlineData("game.rom_of", MachineField.RomOf)] - [InlineData("game.rotation", MachineField.Rotation)] - [InlineData("game.runnable", MachineField.Runnable)] - [InlineData("game.sampleof", MachineField.SampleOf)] - [InlineData("game.sample_of", MachineField.SampleOf)] - [InlineData("game.score", MachineField.Score)] - [InlineData("game.sourcefile", MachineField.SourceFile)] - [InlineData("game.source_file", MachineField.SourceFile)] - [InlineData("game.amstatus", MachineField.Status)] - [InlineData("game.am_status", MachineField.Status)] - [InlineData("game.gamestatus", MachineField.Status)] - [InlineData("game.supportstatus", MachineField.Status)] - [InlineData("game.support_status", MachineField.Status)] - [InlineData("game.subgenre", MachineField.Subgenre)] - [InlineData("game.sub_genre", MachineField.Subgenre)] - [InlineData("game.supported", MachineField.Supported)] - [InlineData("game.system", MachineField.System)] - [InlineData("game.msxsystem", MachineField.System)] - [InlineData("game.msx_system", MachineField.System)] - [InlineData("game.titleid", MachineField.TitleID)] - [InlineData("game.title_id", MachineField.TitleID)] - [InlineData("game.type", MachineField.Type)] - [InlineData("game.year", MachineField.Year)] - public void AsMachineFieldTest(string? field, MachineField expected) - { - MachineField actual = field.AsMachineField(); - Assert.Equal(expected, actual); - } - [Theory] [InlineData(null, MachineType.None)] [InlineData("none", MachineType.None)] @@ -878,7 +783,6 @@ namespace SabreTools.Test.Core [InlineData(ItemType.NULL, 54)] [InlineData(LoadFlag.NULL, 14)] [InlineData(LogLevel.VERBOSE, 4)] - [InlineData(MachineField.NULL, 68)] [InlineData(MachineType.None, 6)] [InlineData(MergingFlag.None, 12)] [InlineData(NodumpFlag.None, 4)] diff --git a/SabreTools/Features/Batch.cs b/SabreTools/Features/Batch.cs index a87c0ff1..7579072b 100644 --- a/SabreTools/Features/Batch.cs +++ b/SabreTools/Features/Batch.cs @@ -8,6 +8,7 @@ using SabreTools.Core; using SabreTools.Core.Tools; using SabreTools.DatFiles; using SabreTools.DatTools; +using SabreTools.Filter; using SabreTools.Filtering; using SabreTools.Hashing; using SabreTools.Help; @@ -46,13 +47,13 @@ Add new output format(s): format(datformat, ...); Set the output directory: output(outdir); Write the internal items: write([overwrite = true]); Reset the internal state: reset();"; - Features = new Dictionary(); + Features = []; // Common Features AddCommonFeatures(); } - public override bool ProcessFeatures(Dictionary features) + public override bool ProcessFeatures(Dictionary features) { // If the base fails, just fail out if (!base.ProcessFeatures(features)) @@ -112,10 +113,10 @@ Reset the internal state: reset();"; } // Validate that the command has the proper number and type of arguments - (bool valid, string error) = command.ValidateArguments(); + (bool valid, string? error) = command.ValidateArguments(); if (!valid) { - logger.User(error); + logger.User(error ?? string.Empty); logger.User($"Usage: {command.Usage()}"); break; } @@ -138,7 +139,7 @@ Reset the internal state: reset();"; /// private abstract class BatchCommand { - public string Name { get; private set; } + public string Name { get; set; } public List Arguments { get; private set; } = []; /// @@ -231,7 +232,7 @@ Reset the internal state: reset();"; } /// - public override (bool, string) ValidateArguments() + public override (bool, string?) ValidateArguments() { if (Arguments.Count != 0) { @@ -265,7 +266,7 @@ Reset the internal state: reset();"; } /// - public override (bool, string) ValidateArguments() + public override (bool, string?) ValidateArguments() { if (Arguments.Count == 0) { @@ -308,7 +309,7 @@ Reset the internal state: reset();"; } /// - public override (bool, string) ValidateArguments() + public override (bool, string?) ValidateArguments() { if (Arguments.Count != 2) { @@ -317,13 +318,11 @@ Reset the internal state: reset();"; } // Read in the individual arguments - MachineField extraMachineField = Arguments[0].AsMachineField(); - DatItemField extraDatItemField = Arguments[0].AsDatItemField(); + (string? type, string? key) = FilterParser.ParseFilterId(Arguments[0]); string extraFile = Arguments[1]; // If we had an invalid input, log and continue - if (extraMachineField == MachineField.NULL - && extraDatItemField == DatItemField.NULL) + if (type == null && key == null) { string message = $"{Arguments[0]} was an invalid field name"; return (false, message); @@ -341,7 +340,7 @@ Reset the internal state: reset();"; public override void Process(BatchState batchState) { // Read in the individual arguments - (string?, string?) fieldName = SabreTools.Filter.FilterParser.ParseFilterId(Arguments[0]); + (string?, string?) fieldName = FilterParser.ParseFilterId(Arguments[0]); string extraFile = Arguments[1]; // Create the extra INI @@ -379,9 +378,7 @@ Reset the internal state: reset();"; } // Read in the individual arguments - DatHeaderField filterDatHeaderField = Arguments[0].AsDatHeaderField(); - MachineField filterMachineField = Arguments[0].AsMachineField(); - DatItemField filterDatItemField = Arguments[0].AsDatItemField(); + (string? type, string? key) = FilterParser.ParseFilterId(Arguments[0]); bool? filterRemove = false; if (Arguments.Count >= 3) filterRemove = Arguments[2].AsYesNo(); @@ -390,9 +387,7 @@ Reset the internal state: reset();"; filterPerMachine = Arguments[3].AsYesNo(); // If we had an invalid input, log and continue - if (filterDatHeaderField == DatHeaderField.NULL - && filterMachineField == MachineField.NULL - && filterDatItemField == DatItemField.NULL) + if (type == null && key == null) { string message = $"{Arguments[0]} was an invalid field name"; return (false, message); @@ -456,7 +451,7 @@ Reset the internal state: reset();"; } /// - public override (bool, string) ValidateArguments() + public override (bool, string?) ValidateArguments() { if (Arguments.Count == 0) { @@ -509,7 +504,7 @@ Reset the internal state: reset();"; } /// - public override (bool, string) ValidateArguments() + public override (bool, string?) ValidateArguments() { if (Arguments.Count == 0) { @@ -549,7 +544,7 @@ Reset the internal state: reset();"; } /// - public override (bool, string) ValidateArguments() + public override (bool, string?) ValidateArguments() { if (Arguments.Count != 1) { @@ -597,7 +592,7 @@ Reset the internal state: reset();"; } /// - public override (bool, string) ValidateArguments() + public override (bool, string?) ValidateArguments() { if (Arguments.Count == 0) { @@ -631,7 +626,7 @@ Reset the internal state: reset();"; } /// - public override (bool, string) ValidateArguments() + public override (bool, string?) ValidateArguments() { if (Arguments.Count == 0) { @@ -665,7 +660,7 @@ Reset the internal state: reset();"; } /// - public override (bool, string) ValidateArguments() + public override (bool, string?) ValidateArguments() { if (Arguments.Count != 1) { @@ -698,7 +693,7 @@ Reset the internal state: reset();"; } /// - public override (bool, string) ValidateArguments() + public override (bool, string?) ValidateArguments() { if (Arguments.Count == 0) { @@ -733,7 +728,7 @@ Reset the internal state: reset();"; } /// - public override (bool, string) ValidateArguments() + public override (bool, string?) ValidateArguments() { if (Arguments.Count != 0) { @@ -766,7 +761,7 @@ Reset the internal state: reset();"; } /// - public override (bool, string) ValidateArguments() + public override (bool, string?) ValidateArguments() { if (Arguments.Count != 0) { @@ -800,7 +795,7 @@ Reset the internal state: reset();"; } /// - public override (bool, string) ValidateArguments() + public override (bool, string?) ValidateArguments() { if (Arguments.Count != 2) { @@ -847,7 +842,7 @@ Reset the internal state: reset();"; } /// - public override (bool, string) ValidateArguments() + public override (bool, string?) ValidateArguments() { if (Arguments.Count > 1) { @@ -894,7 +889,7 @@ Reset the internal state: reset();"; { public DatFile DatFile { get; set; } = DatFile.Create(); public int Index { get; set; } = 0; - public string OutputDirectory { get; set; } = null; + public string? OutputDirectory { get; set; } = null; /// /// Reset the current state