diff --git a/SabreTools.Filter/FilterParser.cs b/SabreTools.Filter/FilterParser.cs index e71d1073..b5cd43f0 100644 --- a/SabreTools.Filter/FilterParser.cs +++ b/SabreTools.Filter/FilterParser.cs @@ -1,6 +1,7 @@ using System; using System.Linq; using System.Reflection; +using SabreTools.Models; using SabreTools.Models.Internal; namespace SabreTools.Filter @@ -55,16 +56,8 @@ namespace SabreTools.Filter if (constantMatch == null) return (null, null); - // Filter out fields that can't be matched on - return constantMatch switch - { - Header.CanOpenKey => (null, null), - Header.ImagesKey => (null, null), - Header.InfosKey => (null, null), - Header.NewDatKey => (null, null), - Header.SearchKey => (null, null), - _ => (MetadataFile.HeaderKey, constantMatch), - }; + // Return the sanitized ID + return (MetadataFile.HeaderKey, constantMatch); } /// @@ -82,46 +75,13 @@ namespace SabreTools.Filter if (constantMatch == null) return (null, null); - // Filter out fields that can't be matched on - return constantMatch switch - { - Machine.AdjusterKey => (null, null), - Machine.ArchiveKey => (null, null), - Machine.BiosSetKey => (null, null), - Machine.ChipKey => (null, null), - Machine.ConfigurationKey => (null, null), - Machine.ControlKey => (null, null), - Machine.DeviceKey => (null, null), - Machine.DeviceRefKey => (null, null), - Machine.DipSwitchKey => (null, null), - Machine.DiskKey => (null, null), - Machine.DisplayKey => (null, null), - Machine.DriverKey => (null, null), - Machine.DumpKey => (null, null), - Machine.FeatureKey => (null, null), - Machine.InfoKey => (null, null), - Machine.InputKey => (null, null), - Machine.MediaKey => (null, null), - Machine.PartKey => (null, null), - Machine.PortKey => (null, null), - Machine.RamOptionKey => (null, null), - Machine.ReleaseKey => (null, null), - Machine.RomKey => (null, null), - Machine.SampleKey => (null, null), - Machine.SharedFeatKey => (null, null), - Machine.SlotKey => (null, null), - Machine.SoftwareListKey => (null, null), - Machine.SoundKey => (null, null), - Machine.TruripKey => (null, null), - Machine.VideoKey => (null, null), - _ => (MetadataFile.MachineKey, constantMatch), - }; + // Return the sanitized ID + return (MetadataFile.MachineKey, constantMatch); } /// /// Get constant values for the given type, if possible /// - /// TODO: Create a NoFilter attribute for non-mappable filter IDs private static string[]? GetConstants(Type? type) { if (type == null) @@ -133,6 +93,7 @@ namespace SabreTools.Filter return fields .Where(f => f.IsLiteral && !f.IsInitOnly) + .Where(f => f.CustomAttributes.Any(a => a.AttributeType == typeof(NoFilterAttribute))) .Select(f => f.GetRawConstantValue() as string) .Where(v => v != null) .ToArray()!; diff --git a/SabreTools.Models/Internal/Adjuster.cs b/SabreTools.Models/Internal/Adjuster.cs index e48aa708..77014dcb 100644 --- a/SabreTools.Models/Internal/Adjuster.cs +++ b/SabreTools.Models/Internal/Adjuster.cs @@ -9,6 +9,7 @@ namespace SabreTools.Models.Internal #region Keys // Condition + [NoFilter] public const string ConditionKey = "condition"; /// bool diff --git a/SabreTools.Models/Internal/ConfSetting.cs b/SabreTools.Models/Internal/ConfSetting.cs index 6f24d52d..756e3743 100644 --- a/SabreTools.Models/Internal/ConfSetting.cs +++ b/SabreTools.Models/Internal/ConfSetting.cs @@ -9,6 +9,7 @@ namespace SabreTools.Models.Internal #region Keys /// Condition + [NoFilter] public const string ConditionKey = "condition"; /// (yes|no) "no" diff --git a/SabreTools.Models/Internal/Configuration.cs b/SabreTools.Models/Internal/Configuration.cs index be432faf..ab6da749 100644 --- a/SabreTools.Models/Internal/Configuration.cs +++ b/SabreTools.Models/Internal/Configuration.cs @@ -9,12 +9,15 @@ namespace SabreTools.Models.Internal #region Keys /// Condition + [NoFilter] public const string ConditionKey = "condition"; /// ConfLocation[] + [NoFilter] public const string ConfLocationKey = "conflocation"; /// ConfSetting[] + [NoFilter] public const string ConfSettingKey = "confsetting"; /// string diff --git a/SabreTools.Models/Internal/DataArea.cs b/SabreTools.Models/Internal/DataArea.cs index 3d592189..49325ce8 100644 --- a/SabreTools.Models/Internal/DataArea.cs +++ b/SabreTools.Models/Internal/DataArea.cs @@ -15,6 +15,7 @@ namespace SabreTools.Models.Internal public const string NameKey = "name"; /// Rom[] + [NoFilter] public const string RomKey = "rom"; /// long diff --git a/SabreTools.Models/Internal/Device.cs b/SabreTools.Models/Internal/Device.cs index abfdec1b..e1732eba 100644 --- a/SabreTools.Models/Internal/Device.cs +++ b/SabreTools.Models/Internal/Device.cs @@ -9,12 +9,14 @@ namespace SabreTools.Models.Internal #region Keys /// Extension[] + [NoFilter] public const string ExtensionKey = "extension"; /// string public const string FixedImageKey = "fixed_image"; /// Instance + [NoFilter] public const string InstanceKey = "instance"; /// string diff --git a/SabreTools.Models/Internal/DipSwitch.cs b/SabreTools.Models/Internal/DipSwitch.cs index 9bad17b3..41b8f1f5 100644 --- a/SabreTools.Models/Internal/DipSwitch.cs +++ b/SabreTools.Models/Internal/DipSwitch.cs @@ -9,15 +9,18 @@ namespace SabreTools.Models.Internal #region Keys /// Condition + [NoFilter] public const string ConditionKey = "condition"; /// (yes|no) "no" public const string DefaultKey = "default"; /// DipLocation[] + [NoFilter] public const string DipLocationKey = "diplocation"; /// DipValue[] + [NoFilter] public const string DipValueKey = "dipvalue"; /// string[] diff --git a/SabreTools.Models/Internal/DipValue.cs b/SabreTools.Models/Internal/DipValue.cs index a0b75459..7bf27357 100644 --- a/SabreTools.Models/Internal/DipValue.cs +++ b/SabreTools.Models/Internal/DipValue.cs @@ -9,6 +9,7 @@ namespace SabreTools.Models.Internal #region Keys /// Condition + [NoFilter] public const string ConditionKey = "condition"; /// (yes|no) "no" diff --git a/SabreTools.Models/Internal/DiskArea.cs b/SabreTools.Models/Internal/DiskArea.cs index d8f7f40c..5f4420ef 100644 --- a/SabreTools.Models/Internal/DiskArea.cs +++ b/SabreTools.Models/Internal/DiskArea.cs @@ -9,6 +9,7 @@ namespace SabreTools.Models.Internal #region Keys /// Disk[] + [NoFilter] public const string DiskKey = "disk"; /// string diff --git a/SabreTools.Models/Internal/Dump.cs b/SabreTools.Models/Internal/Dump.cs index 12bd685c..d3d52e29 100644 --- a/SabreTools.Models/Internal/Dump.cs +++ b/SabreTools.Models/Internal/Dump.cs @@ -9,15 +9,19 @@ namespace SabreTools.Models.Internal #region Keys /// Rom + [NoFilter] public const string MegaRomKey = "megarom"; /// Original + [NoFilter] public const string OriginalKey = "original"; /// Rom + [NoFilter] public const string RomKey = "rom"; /// Rom + [NoFilter] public const string SCCPlusCartKey = "sccpluscart"; #endregion diff --git a/SabreTools.Models/Internal/Header.cs b/SabreTools.Models/Internal/Header.cs index bf06312a..a5bdb76f 100644 --- a/SabreTools.Models/Internal/Header.cs +++ b/SabreTools.Models/Internal/Header.cs @@ -18,6 +18,7 @@ namespace SabreTools.Models.Internal /// TODO: This needs an internal model OR mapping to fields /// CanOpen + [NoFilter] public const string CanOpenKey = "canOpen"; /// string @@ -67,6 +68,7 @@ namespace SabreTools.Models.Internal /// TODO: This needs an internal model OR mapping to fields /// Search + [NoFilter] public const string ImagesKey = "images"; /// string @@ -74,6 +76,7 @@ namespace SabreTools.Models.Internal /// TODO: This needs an internal model OR mapping to fields /// Infos + [NoFilter] public const string InfosKey = "infos"; /// (yes|no) "no" @@ -93,6 +96,7 @@ namespace SabreTools.Models.Internal /// TODO: This needs an internal model OR mapping to fields /// NewDat + [NoFilter] public const string NewDatKey = "newDat"; /// string @@ -127,6 +131,7 @@ namespace SabreTools.Models.Internal /// TODO: This needs an internal model OR mapping to fields /// Search + [NoFilter] public const string SearchKey = "search"; /// string diff --git a/SabreTools.Models/Internal/Machine.cs b/SabreTools.Models/Internal/Machine.cs index 95dd5d0b..35f23d1e 100644 --- a/SabreTools.Models/Internal/Machine.cs +++ b/SabreTools.Models/Internal/Machine.cs @@ -8,12 +8,15 @@ namespace SabreTools.Models.Internal #region Keys /// Adjuster[] + [NoFilter] public const string AdjusterKey = "adjuster"; /// Archive[] + [NoFilter] public const string ArchiveKey = "archive"; /// BiosSet[] + [NoFilter] public const string BiosSetKey = "biosset"; /// string @@ -26,6 +29,7 @@ namespace SabreTools.Models.Internal public const string CategoryKey = "category"; /// Chip[] + [NoFilter] public const string ChipKey = "chip"; /// string @@ -41,6 +45,7 @@ namespace SabreTools.Models.Internal public const string CompanyKey = "company"; /// Configuration[] + [NoFilter] public const string ConfigurationKey = "configuration"; /// string @@ -53,33 +58,40 @@ namespace SabreTools.Models.Internal public const string DescriptionKey = "description"; /// Device[] + [NoFilter] public const string DeviceKey = "device"; /// DeviceRef[] + [NoFilter] public const string DeviceRefKey = "device_ref"; /// DipSwitch[] + [NoFilter] public const string DipSwitchKey = "dipswitch"; /// string public const string DirNameKey = "dirName"; /// Disk[] + [NoFilter] public const string DiskKey = "disk"; /// string public const string DisplayCountKey = "displaycount"; /// Display[] + [NoFilter] public const string DisplayKey = "display"; /// string public const string DisplayTypeKey = "displaytype"; /// Driver + [NoFilter] public const string DriverKey = "driver"; /// Dump[] + [NoFilter] public const string DumpKey = "dump"; /// string @@ -95,6 +107,7 @@ namespace SabreTools.Models.Internal public const string FavoriteKey = "favorite"; /// Feature[] + [NoFilter] public const string FeatureKey = "feature"; /// string @@ -116,9 +129,11 @@ namespace SabreTools.Models.Internal public const string ImageNumberKey = "imageNumber"; /// Info[] + [NoFilter] public const string InfoKey = "info"; /// Input + [NoFilter] public const string InputKey = "input"; /// (yes|no) "no" @@ -140,6 +155,7 @@ namespace SabreTools.Models.Internal public const string ManufacturerKey = "manufacturer"; /// Media[] + [NoFilter] public const string MediaKey = "media"; /// string @@ -149,6 +165,7 @@ namespace SabreTools.Models.Internal public const string NotesKey = "notes"; /// Part[] + [NoFilter] public const string PartKey = "part"; /// string @@ -161,24 +178,28 @@ namespace SabreTools.Models.Internal public const string PlayersKey = "players"; /// Port[] + [NoFilter] public const string PortKey = "port"; /// string public const string PublisherKey = "publisher"; /// RamOption[] + [NoFilter] public const string RamOptionKey = "ramoption"; /// string public const string RebuildToKey = "rebuildto"; /// Release[] + [NoFilter] public const string ReleaseKey = "release"; /// string public const string ReleaseNumberKey = "releaseNumber"; /// Rom[] + [NoFilter] public const string RomKey = "rom"; /// string @@ -191,6 +212,7 @@ namespace SabreTools.Models.Internal public const string RunnableKey = "runnable"; /// Sample[] + [NoFilter] public const string SampleKey = "sample"; /// string @@ -200,15 +222,19 @@ namespace SabreTools.Models.Internal public const string SaveTypeKey = "saveType"; /// SharedFeat[] + [NoFilter] public const string SharedFeatKey = "sharedfeat"; /// Slot[] + [NoFilter] public const string SlotKey = "slot"; /// SoftwareList[] + [NoFilter] public const string SoftwareListKey = "softwarelist"; /// Sound + [NoFilter] public const string SoundKey = "sound"; /// string @@ -231,9 +257,11 @@ namespace SabreTools.Models.Internal /// TODO: This needs an internal model OR mapping to fields /// Trurip + [NoFilter] public const string TruripKey = "trurip"; /// Video[] + [NoFilter] public const string VideoKey = "video"; /// string diff --git a/SabreTools.Models/Internal/MetadataFile.cs b/SabreTools.Models/Internal/MetadataFile.cs index 856ad3bf..0b1f5fc0 100644 --- a/SabreTools.Models/Internal/MetadataFile.cs +++ b/SabreTools.Models/Internal/MetadataFile.cs @@ -8,9 +8,11 @@ namespace SabreTools.Models.Internal #region Keys /// Machine[] + [NoFilter] public const string MachineKey = "machine"; /// Header + [NoFilter] public const string HeaderKey = "header"; #endregion diff --git a/SabreTools.Models/Internal/Part.cs b/SabreTools.Models/Internal/Part.cs index cb9f7279..461623d3 100644 --- a/SabreTools.Models/Internal/Part.cs +++ b/SabreTools.Models/Internal/Part.cs @@ -9,15 +9,19 @@ namespace SabreTools.Models.Internal #region Keys /// DataArea[] + [NoFilter] public const string DataAreaKey = "dataarea"; /// DiskArea[] + [NoFilter] public const string DiskAreaKey = "diskarea"; /// DipSwitch[] + [NoFilter] public const string DipSwitchKey = "dipswitch"; /// Feature[] + [NoFilter] public const string FeatureKey = "feature"; /// string diff --git a/SabreTools.Models/Internal/Port.cs b/SabreTools.Models/Internal/Port.cs index 2e9275e5..231168c6 100644 --- a/SabreTools.Models/Internal/Port.cs +++ b/SabreTools.Models/Internal/Port.cs @@ -9,6 +9,7 @@ namespace SabreTools.Models.Internal #region Keys /// Analog[] + [NoFilter] public const string AnalogKey = "analog"; /// string diff --git a/SabreTools.Models/Internal/Slot.cs b/SabreTools.Models/Internal/Slot.cs index 45325a8e..b40abc74 100644 --- a/SabreTools.Models/Internal/Slot.cs +++ b/SabreTools.Models/Internal/Slot.cs @@ -12,6 +12,7 @@ namespace SabreTools.Models.Internal public const string NameKey = "name"; /// SlotOption[] + [NoFilter] public const string SlotOptionKey = "slotoption"; #endregion diff --git a/SabreTools.Models/Internal/Software.cs b/SabreTools.Models/Internal/Software.cs index ba545b41..45e712e9 100644 --- a/SabreTools.Models/Internal/Software.cs +++ b/SabreTools.Models/Internal/Software.cs @@ -15,6 +15,7 @@ namespace SabreTools.Models.Internal public const string DescriptionKey = "description"; /// Info[] + [NoFilter] public const string InfoKey = "info"; /// string @@ -24,12 +25,14 @@ namespace SabreTools.Models.Internal public const string NotesKey = "notes"; /// Part[] + [NoFilter] public const string PartKey = "part"; /// string public const string PublisherKey = "publisher"; /// SharedFeat[] + [NoFilter] public const string SharedFeatKey = "sharedfeat"; /// (yes|partial|no) "yes" diff --git a/SabreTools.Models/Internal/SoftwareList.cs b/SabreTools.Models/Internal/SoftwareList.cs index 100fb71e..d7666659 100644 --- a/SabreTools.Models/Internal/SoftwareList.cs +++ b/SabreTools.Models/Internal/SoftwareList.cs @@ -21,6 +21,7 @@ namespace SabreTools.Models.Internal public const string NotesKey = "notes"; /// Software[] + [NoFilter] public const string SoftwareKey = "software"; /// (original|compatible) diff --git a/SabreTools.Models/NoFilterAttribute.cs b/SabreTools.Models/NoFilterAttribute.cs new file mode 100644 index 00000000..314be39b --- /dev/null +++ b/SabreTools.Models/NoFilterAttribute.cs @@ -0,0 +1,8 @@ +namespace SabreTools.Models +{ + /// + /// Marks a property as required on write + /// + [System.AttributeUsage(System.AttributeTargets.Field)] + public class NoFilterAttribute : System.Attribute { } +} \ No newline at end of file