diff --git a/SabreTools.Filtering/DatHeaderFilter.cs b/SabreTools.Filtering/DatHeaderFilter.cs
index 16a58432..debe84af 100644
--- a/SabreTools.Filtering/DatHeaderFilter.cs
+++ b/SabreTools.Filtering/DatHeaderFilter.cs
@@ -11,17 +11,8 @@ namespace SabreTools.Filtering
///
/// TODO: Investigate how to reduce the amount of hardcoded filter statements
/// TODO: Add DatHeader filters
- public class DatHeaderFilter
+ public class DatHeaderFilter : Filter
{
- #region Logging
-
- ///
- /// Logging object
- ///
- private readonly Logger logger;
-
- #endregion
-
#region Constructors
///
@@ -40,29 +31,18 @@ namespace SabreTools.Filtering
/// Populate the filters object using a set of key:value filters
///
/// List of key:value where ~key/!key is negated
- public void PopulateFromList(List filters)
+ public override void PopulateFromList(List filters)
{
foreach (string filterPair in filters)
{
+ (string field, string value, bool negate) = ProcessFilterPair(filterPair);
+
// If we don't even have a possible filter pair
- if (!filterPair.Contains(":"))
- {
- logger.Warning($"'{filterPair}` is not a valid filter string. Valid filter strings are of the form 'key:value'. Please refer to README.1ST or the help feature for more details.");
+ if (field == null && value == null)
continue;
- }
- string filterPairTrimmed = filterPair.Trim('"', ' ', '\t');
- bool negate = filterPairTrimmed.StartsWith("!")
- || filterPairTrimmed.StartsWith("~")
- || filterPairTrimmed.StartsWith("not-");
- filterPairTrimmed = filterPairTrimmed.TrimStart('!', '~');
- filterPairTrimmed = filterPairTrimmed.StartsWith("not-") ? filterPairTrimmed.Substring(4) : filterPairTrimmed;
-
- string filterFieldString = filterPairTrimmed.Split(':')[0].ToLowerInvariant().Trim('"', ' ', '\t');
- string filterValue = filterPairTrimmed.Substring(filterFieldString.Length + 1).Trim('"', ' ', '\t');
-
- DatHeaderField filterField = filterFieldString.AsDatHeaderField();
- SetFilter(filterField, filterValue, negate);
+ DatHeaderField filterField = field.AsDatHeaderField();
+ SetFilter(filterField, value, negate);
}
}
diff --git a/SabreTools.Filtering/DatItemFilter.cs b/SabreTools.Filtering/DatItemFilter.cs
index 9df47f71..d47e41d4 100644
--- a/SabreTools.Filtering/DatItemFilter.cs
+++ b/SabreTools.Filtering/DatItemFilter.cs
@@ -1,5 +1,4 @@
-using System;
-using System.Collections.Generic;
+using System.Collections.Generic;
using SabreTools.Core;
using SabreTools.Core.Tools;
@@ -12,7 +11,7 @@ namespace SabreTools.Filtering
///
/// TODO: Can clever use of Filtering allow for easier external splitting methods?
/// TODO: Investigate how to reduce the amount of hardcoded filter statements
- public class DatItemFilter
+ public class DatItemFilter : Filter
{
#region Fields
@@ -200,15 +199,6 @@ namespace SabreTools.Filtering
#endregion // Fields
- #region Logging
-
- ///
- /// Logging object
- ///
- private readonly Logger logger;
-
- #endregion
-
#region Constructors
///
@@ -227,29 +217,18 @@ namespace SabreTools.Filtering
/// Populate the filters object using a set of key:value filters
///
/// List of key:value where ~key/!key is negated
- public void PopulateFromList(List filters)
+ public override void PopulateFromList(List filters)
{
foreach (string filterPair in filters)
{
+ (string field, string value, bool negate) = ProcessFilterPair(filterPair);
+
// If we don't even have a possible filter pair
- if (!filterPair.Contains(":"))
- {
- logger.Warning($"'{filterPair}` is not a valid filter string. Valid filter strings are of the form 'key:value'. Please refer to README.1ST or the help feature for more details.");
+ if (field == null && value == null)
continue;
- }
- string filterPairTrimmed = filterPair.Trim('"', ' ', '\t');
- bool negate = filterPairTrimmed.StartsWith("!")
- || filterPairTrimmed.StartsWith("~")
- || filterPairTrimmed.StartsWith("not-");
- filterPairTrimmed = filterPairTrimmed.TrimStart('!', '~');
- filterPairTrimmed = filterPairTrimmed.StartsWith("not-") ? filterPairTrimmed.Substring(4) : filterPairTrimmed;
-
- string filterFieldString = filterPairTrimmed.Split(':')[0].ToLowerInvariant().Trim('"', ' ', '\t');
- string filterValue = filterPairTrimmed.Substring(filterFieldString.Length + 1).Trim('"', ' ', '\t');
-
- DatItemField filterField = filterFieldString.AsDatItemField();
- SetFilter(filterField, filterValue, negate);
+ DatItemField filterField = field.AsDatItemField();
+ SetFilter(filterField, value, negate);
}
}
@@ -810,5 +789,7 @@ namespace SabreTools.Filtering
#endregion // Item-Specific
}
}
+
+ #endregion
}
}
diff --git a/SabreTools.Filtering/Filter.cs b/SabreTools.Filtering/Filter.cs
index 9b5cd627..ba1aaa31 100644
--- a/SabreTools.Filtering/Filter.cs
+++ b/SabreTools.Filtering/Filter.cs
@@ -1,8 +1,6 @@
using System;
using System.Collections.Generic;
-using SabreTools.Core;
-using SabreTools.Core.Tools;
using SabreTools.Logging;
namespace SabreTools.Filtering
@@ -10,294 +8,17 @@ namespace SabreTools.Filtering
///
/// Represents the filtering operations that need to be performed on a set of items, usually a DAT
///
- /// TODO: Can clever use of Filtering allow for easier external splitting methods?
- /// TODO: Investigate how to reduce the amount of hardcoded filter statements
- public class Filter
+ public abstract class Filter
{
- #region Fields
-
- #region Machine Filters
-
- #region Common
-
- public FilterItem Machine_Name { get; private set; } = new FilterItem();
- public FilterItem Machine_Comment { get; private set; } = new FilterItem();
- public FilterItem Machine_Description { get; private set; } = new FilterItem();
- public FilterItem Machine_Year { get; private set; } = new FilterItem();
- public FilterItem Machine_Manufacturer { get; private set; } = new FilterItem();
- public FilterItem Machine_Publisher { get; private set; } = new FilterItem();
- public FilterItem Machine_Category { get; private set; } = new FilterItem();
- public FilterItem Machine_RomOf { get; private set; } = new FilterItem();
- public FilterItem Machine_CloneOf { get; private set; } = new FilterItem();
- public FilterItem Machine_SampleOf { get; private set; } = new FilterItem();
- public FilterItem Machine_Type { get; private set; } = new FilterItem() { Positive = 0x0, Negative = 0x0 };
-
- #endregion
-
- #region AttractMode
-
- public FilterItem Machine_Players { get; private set; } = new FilterItem();
- public FilterItem Machine_Rotation { get; private set; } = new FilterItem();
- public FilterItem Machine_Control { get; private set; } = new FilterItem();
- public FilterItem Machine_Status { get; private set; } = new FilterItem();
- public FilterItem Machine_DisplayCount { get; private set; } = new FilterItem();
- public FilterItem Machine_DisplayType { get; private set; } = new FilterItem();
- public FilterItem Machine_Buttons { get; private set; } = new FilterItem();
-
- #endregion
-
- #region ListXML
-
- public FilterItem Machine_SourceFile { get; private set; } = new FilterItem();
- public FilterItem Machine_Runnable { get; private set; } = new FilterItem() { Positive = Runnable.NULL, Negative = Runnable.NULL };
-
- #endregion
-
- #region Logiqx
-
- public FilterItem Machine_Board { get; private set; } = new FilterItem();
- public FilterItem Machine_RebuildTo { get; private set; } = new FilterItem();
-
- #endregion
-
- #region Logiqx EmuArc
-
- public FilterItem Machine_TitleID { get; private set; } = new FilterItem();
- public FilterItem Machine_Developer { get; private set; } = new FilterItem();
- public FilterItem Machine_Genre { get; private set; } = new FilterItem();
- public FilterItem Machine_Subgenre { get; private set; } = new FilterItem();
- public FilterItem Machine_Ratings { get; private set; } = new FilterItem();
- public FilterItem Machine_Score { get; private set; } = new FilterItem();
- public FilterItem Machine_Enabled { get; private set; } = new FilterItem();
- public FilterItem Machine_CRC { get; private set; } = new FilterItem() { Neutral = null };
- public FilterItem Machine_RelatedTo { get; private set; } = new FilterItem();
-
- #endregion
-
- #region OpenMSX
-
- public FilterItem Machine_GenMSXID { get; private set; } = new FilterItem();
- public FilterItem Machine_System { get; private set; } = new FilterItem();
- public FilterItem Machine_Country { get; private set; } = new FilterItem();
-
- #endregion
-
- #region SoftwareList
-
- public FilterItem Machine_Supported { get; private set; } = new FilterItem() { Positive = Supported.NULL, Negative = Supported.NULL };
-
- #endregion
-
- #endregion // Machine Filters
-
- #region DatItem Filters
-
- #region Common
-
- public FilterItem DatItem_Type { get; private set; } = new FilterItem();
-
- #endregion
-
- #region Item-Specific
-
- #region Actionable
-
- // Rom
- public FilterItem DatItem_Name { get; private set; } = new FilterItem();
- public FilterItem DatItem_Bios { get; private set; } = new FilterItem();
- public FilterItem DatItem_Size { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
- public FilterItem DatItem_CRC { get; private set; } = new FilterItem();
- public FilterItem DatItem_MD5 { get; private set; } = new FilterItem();
-#if NET_FRAMEWORK
- public FilterItem DatItem_RIPEMD160 { get; private set; } = new FilterItem();
-#endif
- public FilterItem DatItem_SHA1 { get; private set; } = new FilterItem();
- public FilterItem DatItem_SHA256 { get; private set; } = new FilterItem();
- public FilterItem DatItem_SHA384 { get; private set; } = new FilterItem();
- public FilterItem DatItem_SHA512 { get; private set; } = new FilterItem();
- public FilterItem DatItem_SpamSum { get; private set; } = new FilterItem();
- public FilterItem DatItem_Merge { get; private set; } = new FilterItem();
- public FilterItem DatItem_Region { get; private set; } = new FilterItem();
- public FilterItem DatItem_Offset { get; private set; } = new FilterItem();
- public FilterItem DatItem_Date { get; private set; } = new FilterItem();
- public FilterItem DatItem_Status { get; private set; } = new FilterItem() { Positive = ItemStatus.NULL, Negative = ItemStatus.NULL };
- public FilterItem DatItem_Optional { get; private set; } = new FilterItem() { Neutral = null };
- public FilterItem DatItem_Inverted { get; private set; } = new FilterItem();
-
- // Rom (AttractMode)
- public FilterItem DatItem_AltName { get; private set; } = new FilterItem();
- public FilterItem DatItem_AltTitle { get; private set; } = new FilterItem();
-
- // Rom (OpenMSX)
- public FilterItem DatItem_Original { get; private set; } = new FilterItem();
- public FilterItem DatItem_OpenMSXSubType { get; private set; } = new FilterItem() { Positive = OpenMSXSubType.NULL, Negative = OpenMSXSubType.NULL };
- public FilterItem DatItem_OpenMSXType { get; private set; } = new FilterItem();
- public FilterItem DatItem_Remark { get; private set; } = new FilterItem();
- public FilterItem DatItem_Boot { get; private set; } = new FilterItem();
-
- // Rom (SoftwareList)
- public FilterItem DatItem_LoadFlag { get; private set; } = new FilterItem() { Positive = LoadFlag.NULL, Negative = LoadFlag.NULL };
- public FilterItem DatItem_Value { get; private set; } = new FilterItem();
-
- // Disk
- public FilterItem DatItem_Index { get; private set; } = new FilterItem();
- public FilterItem DatItem_Writable { get; private set; } = new FilterItem() { Neutral = null };
-
- #endregion
-
- #region Auxiliary
-
- // Adjuster
- public FilterItem DatItem_Default { get; private set; } = new FilterItem() { Neutral = null };
-
- // Analog
- public FilterItem DatItem_Analog_Mask { get; private set; } = new FilterItem();
-
- // BiosSet
- public FilterItem DatItem_Description { get; private set; } = new FilterItem();
-
- // Chip
- public FilterItem DatItem_Tag { get; private set; } = new FilterItem();
- public FilterItem DatItem_ChipType { get; private set; } = new FilterItem() { Positive = ChipType.NULL, Negative = ChipType.NULL };
- public FilterItem DatItem_Clock { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
-
- // Condition
- public FilterItem DatItem_Mask { get; private set; } = new FilterItem();
- public FilterItem DatItem_Relation { get; private set; } = new FilterItem() { Positive = Relation.NULL, Negative = Relation.NULL };
- public FilterItem DatItem_Condition_Tag { get; private set; } = new FilterItem();
- public FilterItem DatItem_Condition_Mask { get; private set; } = new FilterItem();
- public FilterItem DatItem_Condition_Relation { get; private set; } = new FilterItem() { Positive = Relation.NULL, Negative = Relation.NULL };
- public FilterItem DatItem_Condition_Value { get; private set; } = new FilterItem();
-
- // Control
- public FilterItem DatItem_Control_Type { get; private set; } = new FilterItem() { Positive = ControlType.NULL, Negative = ControlType.NULL };
- public FilterItem DatItem_Control_Player { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
- public FilterItem DatItem_Control_Buttons { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
- public FilterItem DatItem_Control_ReqButtons { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
- public FilterItem DatItem_Control_Minimum { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
- public FilterItem DatItem_Control_Maximum { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
- public FilterItem DatItem_Control_Sensitivity { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
- public FilterItem DatItem_Control_KeyDelta { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
- public FilterItem DatItem_Control_Reverse { get; private set; } = new FilterItem() { Neutral = null };
- public FilterItem DatItem_Control_Ways { get; private set; } = new FilterItem();
- public FilterItem DatItem_Control_Ways2 { get; private set; } = new FilterItem();
- public FilterItem DatItem_Control_Ways3 { get; private set; } = new FilterItem();
-
- // DataArea
- public FilterItem DatItem_AreaName { get; private set; } = new FilterItem();
- public FilterItem DatItem_AreaSize { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
- public FilterItem DatItem_AreaWidth { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
- public FilterItem DatItem_AreaEndianness { get; private set; } = new FilterItem() { Positive = Endianness.NULL, Negative = Endianness.NULL };
-
- // Device
- public FilterItem DatItem_DeviceType { get; private set; } = new FilterItem() { Positive = DeviceType.NULL, Negative = DeviceType.NULL };
- public FilterItem DatItem_FixedImage { get; private set; } = new FilterItem();
- public FilterItem DatItem_Mandatory { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
- public FilterItem DatItem_Interface { get; private set; } = new FilterItem();
-
- // Display
- public FilterItem DatItem_DisplayType { get; private set; } = new FilterItem() { Positive = DisplayType.NULL, Negative = DisplayType.NULL };
- public FilterItem DatItem_Rotate { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
- public FilterItem DatItem_FlipX { get; private set; } = new FilterItem() { Neutral = null };
- public FilterItem DatItem_Width { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
- public FilterItem DatItem_Height { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
- public FilterItem DatItem_Refresh { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
- public FilterItem DatItem_PixClock { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
- public FilterItem DatItem_HTotal { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
- public FilterItem DatItem_HBEnd { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
- public FilterItem DatItem_HBStart { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
- public FilterItem DatItem_VTotal { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
- public FilterItem DatItem_VBEnd { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
- public FilterItem DatItem_VBStart { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
-
- // Driver
- public FilterItem DatItem_SupportStatus { get; private set; } = new FilterItem() { Positive = SupportStatus.NULL, Negative = SupportStatus.NULL };
- public FilterItem DatItem_EmulationStatus { get; private set; } = new FilterItem() { Positive = SupportStatus.NULL, Negative = SupportStatus.NULL };
- public FilterItem DatItem_CocktailStatus { get; private set; } = new FilterItem() { Positive = SupportStatus.NULL, Negative = SupportStatus.NULL };
- public FilterItem DatItem_SaveStateStatus { get; private set; } = new FilterItem() { Positive = Supported.NULL, Negative = Supported.NULL };
-
- // Extension
- public FilterItem DatItem_Extension_Name { get; private set; } = new FilterItem();
-
- // Feature
- public FilterItem DatItem_FeatureType { get; private set; } = new FilterItem() { Positive = FeatureType.NULL, Negative = FeatureType.NULL };
- public FilterItem DatItem_FeatureStatus { get; private set; } = new FilterItem() { Positive = FeatureStatus.NULL, Negative = FeatureStatus.NULL };
- public FilterItem DatItem_FeatureOverall { get; private set; } = new FilterItem() { Positive = FeatureStatus.NULL, Negative = FeatureStatus.NULL };
-
- // Input
- public FilterItem DatItem_Service { get; private set; } = new FilterItem() { Neutral = null };
- public FilterItem DatItem_Tilt { get; private set; } = new FilterItem() { Neutral = null };
- public FilterItem DatItem_Players { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
- public FilterItem DatItem_Coins { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
-
- // Instance
- public FilterItem DatItem_Instance_Name { get; private set; } = new FilterItem();
- public FilterItem DatItem_Instance_BriefName { get; private set; } = new FilterItem();
-
- // Location
- public FilterItem DatItem_Location_Name { get; private set; } = new FilterItem();
- public FilterItem