diff --git a/SabreTools.Filter/FilterParser.cs b/SabreTools.Filter/FilterParser.cs index 576aa624..b0bbd40b 100644 --- a/SabreTools.Filter/FilterParser.cs +++ b/SabreTools.Filter/FilterParser.cs @@ -45,6 +45,8 @@ namespace SabreTools.Filter "set" => ParseMachineFilterId(fieldName!), // DatItem + "datitem" => ParseDatItemFilterId(fieldName!), + "item" => ParseDatItemFilterId(fieldName!), _ => ParseDatItemFilterId(itemName, fieldName!), }; } @@ -87,6 +89,23 @@ namespace SabreTools.Filter return (MetadataFile.MachineKey, constantMatch); } + /// + /// Parse and validate item fields + /// + private static (string?, string?) ParseDatItemFilterId(string fieldName) + { + // Get all item types + var itemTypes = TypeHelper.GetDatItemTypeNames(); + + // If we get any matches + string? match = itemTypes.FirstOrDefault(t => t != null && ParseDatItemFilterId(t, fieldName) != (null, null)); + if (match != null) + return ("item", ParseDatItemFilterId(match, fieldName).Item2); + + // Nothing was found + return (null, null); + } + /// /// Parse and validate item fields /// diff --git a/SabreTools.Filter/FilterRunner.cs b/SabreTools.Filter/FilterRunner.cs index 37e023b3..e2c11a6c 100644 --- a/SabreTools.Filter/FilterRunner.cs +++ b/SabreTools.Filter/FilterRunner.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using SabreTools.Models.Metadata; namespace SabreTools.Filter @@ -57,7 +58,7 @@ namespace SabreTools.Filter foreach (var filter in this.Filters) { // If the filter isn't for this object type, skip - if (filter.Key[0] != itemName) + if (filter.Key[0] != itemName || (filter.Key[0] == "item" && TypeHelper.GetDatItemTypeNames().Contains(itemName))) continue; // If we don't get a match, it's a failure diff --git a/SabreTools.Filter/TypeHelper.cs b/SabreTools.Filter/TypeHelper.cs index de8388e5..d382b46d 100644 --- a/SabreTools.Filter/TypeHelper.cs +++ b/SabreTools.Filter/TypeHelper.cs @@ -37,6 +37,18 @@ namespace SabreTools.Filter #endif } + /// + /// Attempt to get all DatItem types + /// + public static string?[] GetDatItemTypeNames() + { + return AppDomain.CurrentDomain.GetAssemblies() + .SelectMany(a => a.GetTypes()) + .Where(t => typeof(DatItem).IsAssignableFrom(t) && t.IsClass) + .Select(GetXmlRootAttributeElementName) + .ToArray(); + } + /// /// Attempt to get the DatItem type from the name /// diff --git a/SabreTools.Test/Filter/FilteringTests.cs b/SabreTools.Test/Filter/FilteringTests.cs index 1d8d0b0c..c42a9be2 100644 --- a/SabreTools.Test/Filter/FilteringTests.cs +++ b/SabreTools.Test/Filter/FilteringTests.cs @@ -11,7 +11,7 @@ namespace SabreTools.Test.Filter public void PassesFiltersDatItemFilterPass() { // Setup filter - var filter = new FilterRunner(["rom.name:foo"]); + var filter = new FilterRunner(["rom.name:foo", "item.name:foo"]); // Setup DatItem var datItem = CreateDatItem(); @@ -25,7 +25,7 @@ namespace SabreTools.Test.Filter public void PassesFiltersDatItemFilterFail() { // Setup filter - var filter = new FilterRunner(["rom.name:bar"]); + var filter = new FilterRunner(["rom.name:bar", "item.name:bar"]); // Setup DatItem var datItem = CreateDatItem(); diff --git a/SabreTools.Test/Filter/PopulationTests.cs b/SabreTools.Test/Filter/PopulationTests.cs index ef2ad01f..4cf44d6e 100644 --- a/SabreTools.Test/Filter/PopulationTests.cs +++ b/SabreTools.Test/Filter/PopulationTests.cs @@ -59,7 +59,7 @@ namespace SabreTools.Test.Filter string[] filters = [ "rom.name:foo", - "rom.name!:bar" + "datitem.name!:bar" ]; // Setup the filter @@ -70,7 +70,7 @@ namespace SabreTools.Test.Filter Assert.Equal("foo", filter.Filters[0].Value); Assert.Equal(Operation.Equals, filter.Filters[0].Operation); - Assert.Equal(new string[] { "rom", "name"}, filter.Filters[1].Key); + Assert.Equal(new string[] { "item", "name"}, filter.Filters[1].Key); Assert.Equal("bar", filter.Filters[1].Value); Assert.Equal(Operation.NotEquals, filter.Filters[1].Operation); }