Add provisions for generic item filters

This commit is contained in:
Matt Nadareski
2024-03-05 09:39:12 -05:00
parent 8875948946
commit 6b7597c052
5 changed files with 37 additions and 5 deletions

View File

@@ -45,6 +45,8 @@ namespace SabreTools.Filter
"set" => ParseMachineFilterId(fieldName!), "set" => ParseMachineFilterId(fieldName!),
// DatItem // DatItem
"datitem" => ParseDatItemFilterId(fieldName!),
"item" => ParseDatItemFilterId(fieldName!),
_ => ParseDatItemFilterId(itemName, fieldName!), _ => ParseDatItemFilterId(itemName, fieldName!),
}; };
} }
@@ -87,6 +89,23 @@ namespace SabreTools.Filter
return (MetadataFile.MachineKey, constantMatch); return (MetadataFile.MachineKey, constantMatch);
} }
/// <summary>
/// Parse and validate item fields
/// </summary>
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);
}
/// <summary> /// <summary>
/// Parse and validate item fields /// Parse and validate item fields
/// </summary> /// </summary>

View File

@@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using SabreTools.Models.Metadata; using SabreTools.Models.Metadata;
namespace SabreTools.Filter namespace SabreTools.Filter
@@ -57,7 +58,7 @@ namespace SabreTools.Filter
foreach (var filter in this.Filters) foreach (var filter in this.Filters)
{ {
// If the filter isn't for this object type, skip // 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; continue;
// If we don't get a match, it's a failure // If we don't get a match, it's a failure

View File

@@ -37,6 +37,18 @@ namespace SabreTools.Filter
#endif #endif
} }
/// <summary>
/// Attempt to get all DatItem types
/// </summary>
public static string?[] GetDatItemTypeNames()
{
return AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(a => a.GetTypes())
.Where(t => typeof(DatItem).IsAssignableFrom(t) && t.IsClass)
.Select(GetXmlRootAttributeElementName)
.ToArray();
}
/// <summary> /// <summary>
/// Attempt to get the DatItem type from the name /// Attempt to get the DatItem type from the name
/// </summary> /// </summary>

View File

@@ -11,7 +11,7 @@ namespace SabreTools.Test.Filter
public void PassesFiltersDatItemFilterPass() public void PassesFiltersDatItemFilterPass()
{ {
// Setup filter // Setup filter
var filter = new FilterRunner(["rom.name:foo"]); var filter = new FilterRunner(["rom.name:foo", "item.name:foo"]);
// Setup DatItem // Setup DatItem
var datItem = CreateDatItem(); var datItem = CreateDatItem();
@@ -25,7 +25,7 @@ namespace SabreTools.Test.Filter
public void PassesFiltersDatItemFilterFail() public void PassesFiltersDatItemFilterFail()
{ {
// Setup filter // Setup filter
var filter = new FilterRunner(["rom.name:bar"]); var filter = new FilterRunner(["rom.name:bar", "item.name:bar"]);
// Setup DatItem // Setup DatItem
var datItem = CreateDatItem(); var datItem = CreateDatItem();

View File

@@ -59,7 +59,7 @@ namespace SabreTools.Test.Filter
string[] filters = string[] filters =
[ [
"rom.name:foo", "rom.name:foo",
"rom.name!:bar" "datitem.name!:bar"
]; ];
// Setup the filter // Setup the filter
@@ -70,7 +70,7 @@ namespace SabreTools.Test.Filter
Assert.Equal("foo", filter.Filters[0].Value); Assert.Equal("foo", filter.Filters[0].Value);
Assert.Equal(Operation.Equals, filter.Filters[0].Operation); 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("bar", filter.Filters[1].Value);
Assert.Equal(Operation.NotEquals, filter.Filters[1].Operation); Assert.Equal(Operation.NotEquals, filter.Filters[1].Operation);
} }