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