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);