diff --git a/SabreTools.Core/Filter/FilterKey.cs b/SabreTools.Core/Filter/FilterKey.cs
new file mode 100644
index 00000000..f6a412f1
--- /dev/null
+++ b/SabreTools.Core/Filter/FilterKey.cs
@@ -0,0 +1,30 @@
+namespace SabreTools.Core.Filter
+{
+ ///
+ /// Represents a single filter key
+ ///
+ public class FilterKey
+ {
+ ///
+ /// Item name associated with the filter
+ ///
+ public readonly string ItemName;
+
+ ///
+ /// Field name associated with the filter
+ ///
+ public readonly string FieldName;
+
+ ///
+ /// Discrete value constructor
+ ///
+ public FilterKey(string itemName, string fieldName)
+ {
+ ItemName = itemName;
+ FieldName = fieldName;
+ }
+
+ ///
+ public override string ToString() => $"{ItemName}.{FieldName}";
+ }
+}
\ No newline at end of file
diff --git a/SabreTools.Core/Filter/FilterObject.cs b/SabreTools.Core/Filter/FilterObject.cs
index 2b96c4df..40fef5e9 100644
--- a/SabreTools.Core/Filter/FilterObject.cs
+++ b/SabreTools.Core/Filter/FilterObject.cs
@@ -12,14 +12,9 @@ namespace SabreTools.Core.Filter
public class FilterObject
{
///
- /// Item name associated with the field
+ /// Item key associated with the filter
///
- public readonly string ItemName;
-
- ///
- /// Field name associated with the filter
- ///
- public readonly string FieldName;
+ public readonly FilterKey Key;
///
/// Value to match in the filter
@@ -39,8 +34,7 @@ namespace SabreTools.Core.Filter
if (!FilterParser.ParseFilterId(keyItem, out string itemName, out string fieldName))
throw new ArgumentOutOfRangeException(nameof(filterString));
- ItemName = itemName;
- FieldName = fieldName;
+ Key = new FilterKey(itemName, fieldName);
Value = value;
Operation = operation;
}
@@ -50,8 +44,7 @@ namespace SabreTools.Core.Filter
if (!FilterParser.ParseFilterId(itemField, out string itemName, out string fieldName))
throw new ArgumentOutOfRangeException(nameof(value));
- ItemName = itemName;
- FieldName = fieldName;
+ Key = new FilterKey(itemName, fieldName);
Value = value;
Operation = GetOperation(operation);
}
@@ -61,8 +54,7 @@ namespace SabreTools.Core.Filter
if (!FilterParser.ParseFilterId(itemField, out string itemName, out string fieldName))
throw new ArgumentOutOfRangeException(nameof(value));
- ItemName = itemName;
- FieldName = fieldName;
+ Key = new FilterKey(itemName, fieldName);
Value = value;
Operation = operation;
}
@@ -93,11 +85,11 @@ namespace SabreTools.Core.Filter
private bool MatchesEqual(DictionaryBase dictionaryBase)
{
// If the key doesn't exist, we count it as null
- if (!dictionaryBase.ContainsKey(FieldName))
+ if (!dictionaryBase.ContainsKey(Key.FieldName))
return Value == null;
// If the value in the dictionary is null
- string? checkValue = dictionaryBase.ReadString(FieldName);
+ string? checkValue = dictionaryBase.ReadString(Key.FieldName);
if (checkValue == null)
return Value == null;
@@ -136,11 +128,11 @@ namespace SabreTools.Core.Filter
private bool MatchesNotEqual(DictionaryBase dictionaryBase)
{
// If the key doesn't exist, we count it as null
- if (!dictionaryBase.ContainsKey(FieldName))
+ if (!dictionaryBase.ContainsKey(Key.FieldName))
return Value != null;
// If the value in the dictionary is null
- string? checkValue = dictionaryBase.ReadString(FieldName);
+ string? checkValue = dictionaryBase.ReadString(Key.FieldName);
if (checkValue == null)
return Value == null;
@@ -179,11 +171,11 @@ namespace SabreTools.Core.Filter
private bool MatchesGreaterThan(DictionaryBase dictionaryBase)
{
// If the key doesn't exist, we count it as null
- if (!dictionaryBase.ContainsKey(FieldName))
+ if (!dictionaryBase.ContainsKey(Key.FieldName))
return false;
// If the value in the dictionary is null
- string? checkValue = dictionaryBase.ReadString(FieldName);
+ string? checkValue = dictionaryBase.ReadString(Key.FieldName);
if (checkValue == null)
return false;
@@ -212,11 +204,11 @@ namespace SabreTools.Core.Filter
private bool MatchesGreaterThanOrEqual(DictionaryBase dictionaryBase)
{
// If the key doesn't exist, we count it as null
- if (!dictionaryBase.ContainsKey(FieldName))
+ if (!dictionaryBase.ContainsKey(Key.FieldName))
return false;
// If the value in the dictionary is null
- string? checkValue = dictionaryBase.ReadString(FieldName);
+ string? checkValue = dictionaryBase.ReadString(Key.FieldName);
if (checkValue == null)
return false;
@@ -245,11 +237,11 @@ namespace SabreTools.Core.Filter
private bool MatchesLessThan(DictionaryBase dictionaryBase)
{
// If the key doesn't exist, we count it as null
- if (!dictionaryBase.ContainsKey(FieldName))
+ if (!dictionaryBase.ContainsKey(Key.FieldName))
return false;
// If the value in the dictionary is null
- string? checkValue = dictionaryBase.ReadString(FieldName);
+ string? checkValue = dictionaryBase.ReadString(Key.FieldName);
if (checkValue == null)
return false;
@@ -278,11 +270,11 @@ namespace SabreTools.Core.Filter
private bool MatchesLessThanOrEqual(DictionaryBase dictionaryBase)
{
// If the key doesn't exist, we count it as null
- if (!dictionaryBase.ContainsKey(FieldName))
+ if (!dictionaryBase.ContainsKey(Key.FieldName))
return false;
// If the value in the dictionary is null
- string? checkValue = dictionaryBase.ReadString(FieldName);
+ string? checkValue = dictionaryBase.ReadString(Key.FieldName);
if (checkValue == null)
return false;
diff --git a/SabreTools.Core/Filter/FilterRunner.cs b/SabreTools.Core/Filter/FilterRunner.cs
index 0430fb90..aa1c5c66 100644
--- a/SabreTools.Core/Filter/FilterRunner.cs
+++ b/SabreTools.Core/Filter/FilterRunner.cs
@@ -54,9 +54,9 @@ namespace SabreTools.Core.Filter
foreach (var filter in Filters)
{
// If the filter isn't for this object type, skip
- if (filter.ItemName != itemName)
+ if (filter.Key.ItemName != itemName)
continue;
- else if (filter.ItemName == "item" && Array.IndexOf(TypeHelper.GetDatItemTypeNames(), itemName) > -1)
+ else if (filter.Key.ItemName == "item" && Array.IndexOf(TypeHelper.GetDatItemTypeNames(), itemName) > -1)
continue;
// If we don't get a match, it's a failure
diff --git a/SabreTools.DatFiles/Setter.cs b/SabreTools.DatFiles/Setter.cs
index 2a048137..ef45f0f9 100644
--- a/SabreTools.DatFiles/Setter.cs
+++ b/SabreTools.DatFiles/Setter.cs
@@ -29,7 +29,7 @@ namespace SabreTools.DatFiles
///
/// Mappings to set DatItem fields
///
- public Dictionary<(string, string), string> ItemFieldMappings { get; } = [];
+ public Dictionary ItemFieldMappings { get; } = [];
#endregion
@@ -49,7 +49,7 @@ namespace SabreTools.DatFiles
///
/// Field name
/// Field value
- public void PopulateSetters(string field, string value)
+ public void PopulateSetters(FilterKey field, string value)
=> PopulateSettersFromList([field], [value]);
///
@@ -57,7 +57,7 @@ namespace SabreTools.DatFiles
///
/// List of field names
/// List of field values
- public void PopulateSettersFromList(List fields, List values)
+ public void PopulateSettersFromList(List fields, List values)
{
// If the list is null or empty, just return
if (values == null || values.Count == 0)
@@ -68,7 +68,7 @@ namespace SabreTools.DatFiles
// Now we loop through and get values for everything
for (int i = 0; i < fields.Count; i++)
{
- string field = fields[i];
+ FilterKey field = fields[i];
string value = values[i];
if (!SetSetter(field, value))
@@ -82,7 +82,7 @@ namespace SabreTools.DatFiles
/// Populate the setters using a set of field names
///
/// Dictionary of mappings
- public void PopulateSettersFromDictionary(Dictionary? mappings)
+ public void PopulateSettersFromDictionary(Dictionary? mappings)
{
// If the dictionary is null or empty, just return
if (mappings == null || mappings.Count == 0)
@@ -93,7 +93,7 @@ namespace SabreTools.DatFiles
// Now we loop through and get values for everything
foreach (var mapping in mappings)
{
- string field = mapping.Key;
+ FilterKey field = mapping.Key;
string value = mapping.Value;
if (!SetSetter(field, value))
@@ -106,29 +106,32 @@ namespace SabreTools.DatFiles
///
/// Set remover from a value
///
- /// Key for the remover to be set
- private bool SetSetter(string field, string value)
+ /// Key for the remover to be set
+ private bool SetSetter(FilterKey key, string value)
{
- // If the key is null or empty, return false
- if (string.IsNullOrEmpty(field))
- return false;
+ // Split the key values for validation
+ string itemName = key.ItemName;
+ string fieldName = key.FieldName;
// Get the parser pair out of it, if possible
- if (!FilterParser.ParseFilterId(field, out string type, out string key))
+ if (!FilterParser.ParseFilterId(ref itemName, ref fieldName))
return false;
- switch (type)
+ // Set the values back on the key
+ key = new FilterKey(itemName, fieldName);
+
+ switch (itemName)
{
case Models.Metadata.MetadataFile.HeaderKey:
- HeaderFieldMappings[key] = value;
+ HeaderFieldMappings[fieldName] = value;
return true;
case Models.Metadata.MetadataFile.MachineKey:
- MachineFieldMappings[key] = value;
+ MachineFieldMappings[fieldName] = value;
return true;
default:
- ItemFieldMappings[(type, key)] = value;
+ ItemFieldMappings[key] = value;
return true;
}
}
@@ -189,16 +192,16 @@ namespace SabreTools.DatFiles
// If there are no field names for this type or generic, return
string? itemType = datItem.GetStringFieldValue(Models.Metadata.DatItem.TypeKey).AsEnumValue().AsStringValue();
- if (itemType == null || (!ItemFieldMappings.Keys.Any(kvp => kvp.Item1 == itemType) && !ItemFieldMappings.Keys.Any(kvp => kvp.Item1 == "item")))
+ if (itemType == null || (!ItemFieldMappings.Keys.Any(kvp => kvp.ItemName == itemType) && !ItemFieldMappings.Keys.Any(kvp => kvp.ItemName == "item")))
return;
// Get the combined list of fields to remove
var fieldMappings = new Dictionary();
- foreach (var mapping in ItemFieldMappings.Where(kvp => kvp.Key.Item1 == "item").ToDictionary(kvp => kvp.Key.Item2, kvp => kvp.Value))
+ foreach (var mapping in ItemFieldMappings.Where(kvp => kvp.Key.ItemName == "item").ToDictionary(kvp => kvp.Key.FieldName, kvp => kvp.Value))
{
fieldMappings[mapping.Key] = mapping.Value;
}
- foreach (var mapping in ItemFieldMappings.Where(kvp => kvp.Key.Item1 == itemType).ToDictionary(kvp => kvp.Key.Item2, kvp => kvp.Value))
+ foreach (var mapping in ItemFieldMappings.Where(kvp => kvp.Key.ItemName == itemType).ToDictionary(kvp => kvp.Key.FieldName, kvp => kvp.Value))
{
fieldMappings[mapping.Key] = mapping.Value;
}
diff --git a/SabreTools.Filtering/ExtraIni.cs b/SabreTools.Filtering/ExtraIni.cs
index 5747b3c1..fb324340 100644
--- a/SabreTools.Filtering/ExtraIni.cs
+++ b/SabreTools.Filtering/ExtraIni.cs
@@ -208,9 +208,9 @@ namespace SabreTools.Filtering
/// Combine ExtraIni fields
///
/// Mapping dictionary from machine name to field mapping
- private Dictionary> CombineExtras()
+ private Dictionary> CombineExtras()
{
- var machineMap = new Dictionary>();
+ var machineMap = new Dictionary>();
// Loop through each of the extras
foreach (ExtraIniItem item in Items)
diff --git a/SabreTools.Filtering/ExtraIniItem.cs b/SabreTools.Filtering/ExtraIniItem.cs
index bce3ea01..e7697c47 100644
--- a/SabreTools.Filtering/ExtraIniItem.cs
+++ b/SabreTools.Filtering/ExtraIniItem.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using SabreTools.Core.Filter;
using SabreTools.IO.Logging;
using SabreTools.IO.Readers;
@@ -13,17 +14,7 @@ namespace SabreTools.Filtering
/// Item type and field to update with INI information
///
/// Formatted like "ItemName.FieldName"
- public string Key => $"{_itemName}.{_fieldName}";
-
- ///
- /// Item type to update with INI information
- ///
- private readonly string _itemName;
-
- ///
- /// Field to update with INI information
- ///
- private readonly string _fieldName;
+ public readonly FilterKey Key;
///
/// Mappings from machine names to value
@@ -36,8 +27,7 @@ namespace SabreTools.Filtering
public ExtraIniItem(string itemName, string fieldName)
{
- _itemName = itemName;
- _fieldName = fieldName;
+ Key = new FilterKey(itemName, fieldName);
}
#endregion
diff --git a/SabreTools.Test/DatFiles/SetterTests.cs b/SabreTools.Test/DatFiles/SetterTests.cs
index 429c5fa3..1721ffe8 100644
--- a/SabreTools.Test/DatFiles/SetterTests.cs
+++ b/SabreTools.Test/DatFiles/SetterTests.cs
@@ -1,3 +1,4 @@
+using SabreTools.Core.Filter;
using SabreTools.DatFiles;
using SabreTools.DatItems;
using SabreTools.DatItems.Formats;
@@ -12,7 +13,7 @@ namespace SabreTools.Test.DatFiles
{
var datItem = CreateDatItem();
var setter = new Setter();
- setter.PopulateSetters("datitem.name", "bar");
+ setter.PopulateSetters(new FilterKey("datitem", "name"), "bar");
setter.SetFields(datItem);
Assert.Equal("bar", datItem.GetName());
}
@@ -22,7 +23,7 @@ namespace SabreTools.Test.DatFiles
{
var datItem = CreateDatItem();
var setter = new Setter();
- setter.PopulateSetters("machine.name", "foo");
+ setter.PopulateSetters(new FilterKey("machine", "name"), "foo");
setter.SetFields(datItem.GetFieldValue(DatItem.MachineKey));
Assert.Equal("foo", datItem.GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey));
}
diff --git a/SabreTools.Test/Filter/PopulationTests.cs b/SabreTools.Test/Filter/PopulationTests.cs
index e54c6256..b1c5ef54 100644
--- a/SabreTools.Test/Filter/PopulationTests.cs
+++ b/SabreTools.Test/Filter/PopulationTests.cs
@@ -43,13 +43,11 @@ namespace SabreTools.Test.Filter
var filter = new FilterRunner(filters);
// Check the filters
- Assert.Equal("machine", filter.Filters[0].ItemName);
- Assert.Equal("name", filter.Filters[0].FieldName);
+ Assert.Equal("machine.name", filter.Filters[0].Key.ToString());
Assert.Equal("foo", filter.Filters[0].Value);
Assert.Equal(Operation.Equals, filter.Filters[0].Operation);
- Assert.Equal("machine", filter.Filters[1].ItemName);
- Assert.Equal("name", filter.Filters[1].FieldName);
+ Assert.Equal("machine.name", filter.Filters[1].Key.ToString());
Assert.Equal("bar", filter.Filters[1].Value);
Assert.Equal(Operation.NotEquals, filter.Filters[1].Operation);
}
@@ -68,13 +66,11 @@ namespace SabreTools.Test.Filter
var filter = new FilterRunner(filters);
// Check the filters
- Assert.Equal("rom", filter.Filters[0].ItemName);
- Assert.Equal("name", filter.Filters[0].FieldName);
+ Assert.Equal("rom.name", filter.Filters[0].Key.ToString());
Assert.Equal("foo", filter.Filters[0].Value);
Assert.Equal(Operation.Equals, filter.Filters[0].Operation);
- Assert.Equal("item", filter.Filters[1].ItemName);
- Assert.Equal("name", filter.Filters[1].FieldName);
+ Assert.Equal("item.name", filter.Filters[1].Key.ToString());
Assert.Equal("bar", filter.Filters[1].Value);
Assert.Equal(Operation.NotEquals, filter.Filters[1].Operation);
}
diff --git a/SabreTools/Features/Batch.cs b/SabreTools/Features/Batch.cs
index 92c8c565..21644815 100644
--- a/SabreTools/Features/Batch.cs
+++ b/SabreTools/Features/Batch.cs
@@ -825,7 +825,8 @@ Reset the internal state: reset();";
string value = Arguments[1];
var setter = new Setter();
- setter.PopulateSetters(field, value);
+ FilterParser.ParseFilterId(Arguments[0], out string itemName, out string fieldName);
+ setter.PopulateSetters(new FilterKey(itemName, fieldName), value);
// Set the header field
setter.SetFields(batchState.DatFile.Header);