diff --git a/SabreTools.Metadata.Filter/FilterKey.cs b/SabreTools.Metadata.Filter/FilterKey.cs index 2136f482..d48200c3 100644 --- a/SabreTools.Metadata.Filter/FilterKey.cs +++ b/SabreTools.Metadata.Filter/FilterKey.cs @@ -335,6 +335,14 @@ namespace SabreTools.Metadata.Filter /// private static bool ParseMachineFilterId(ref string itemName, ref string fieldName) { + // Special case for machine type + if (string.Equals(fieldName, "type", StringComparison.OrdinalIgnoreCase)) + { + itemName = "machine"; + fieldName = "type"; + return true; + } + // Get the set of properties var properties = GetProperties(typeof(Machine)); if (properties is null) diff --git a/SabreTools.Metadata.Filter/FilterObject.cs b/SabreTools.Metadata.Filter/FilterObject.cs index cedc5e89..a73f8032 100644 --- a/SabreTools.Metadata.Filter/FilterObject.cs +++ b/SabreTools.Metadata.Filter/FilterObject.cs @@ -77,6 +77,21 @@ namespace SabreTools.Metadata.Filter /// private bool MatchesEqual(object obj) { + // Special case for machine type + if (obj is Machine machine + && string.Equals(Key.ItemName, "machine", StringComparison.OrdinalIgnoreCase) + && string.Equals(Key.FieldName, "type", StringComparison.OrdinalIgnoreCase)) + { + return Value?.ToLowerInvariant() switch + { + "none" => machine.IsBios != true && machine.IsDevice != true && machine.IsMechanical != true, + "bios" => machine.IsBios == true, + "device" or "dev" => machine.IsDevice == true, + "mechanical" or "mech" => machine.IsMechanical == true, + _ => false, + }; + } + // Process the check value if (!GetCheckValue(obj, Key.FieldName, out string? checkValue)) return string.IsNullOrEmpty(Value); @@ -119,6 +134,21 @@ namespace SabreTools.Metadata.Filter /// private bool MatchesNotEqual(object obj) { + // Special case for machine type + if (obj is Machine machine + && string.Equals(Key.ItemName, "machine", StringComparison.OrdinalIgnoreCase) + && string.Equals(Key.FieldName, "type", StringComparison.OrdinalIgnoreCase)) + { + return Value?.ToLowerInvariant() switch + { + "none" => machine.IsBios == true || machine.IsDevice == true || machine.IsMechanical == true, + "bios" => machine.IsBios != true, + "device" or "dev" => machine.IsDevice != true, + "mechanical" or "mech" => machine.IsMechanical != true, + _ => true, + }; + } + // Process the check value if (!GetCheckValue(obj, Key.FieldName, out string? checkValue)) return string.IsNullOrEmpty(Value); diff --git a/SabreTools.Metadata.Filter/FilterRunner.cs b/SabreTools.Metadata.Filter/FilterRunner.cs index 8ab6fa96..2bc9fef5 100644 --- a/SabreTools.Metadata.Filter/FilterRunner.cs +++ b/SabreTools.Metadata.Filter/FilterRunner.cs @@ -76,14 +76,6 @@ namespace SabreTools.Metadata.Filter // Get the key as a string string key = filter.Key.ToString(); - // Special case for machine types - if (filter.Key.ItemName == "machine" && filter.Key.FieldName == "isbios") - key = $"{"machine"}.COMBINEDTYPE"; - else if (filter.Key.ItemName == "machine" && filter.Key.FieldName == "isdevice") - key = $"{"machine"}.COMBINEDTYPE"; - else if (filter.Key.ItemName == "machine" && filter.Key.FieldName == "ismechanical") - key = $"{"machine"}.COMBINEDTYPE"; - // Set the expected group type GroupType groupType = GroupType.OR;