diff --git a/SabreTools.Metadata.Filter/FilterKey.cs b/SabreTools.Metadata.Filter/FilterKey.cs index 012a745c..f74a1481 100644 --- a/SabreTools.Metadata.Filter/FilterKey.cs +++ b/SabreTools.Metadata.Filter/FilterKey.cs @@ -33,6 +33,8 @@ namespace SabreTools.Metadata.Filter private static readonly string[] _datItemTypeNames = Enum.GetNames(typeof(ItemType)); #endif + #region Per-Type Accepted Keys + /// /// Known keys for Adjuster /// @@ -831,6 +833,8 @@ namespace SabreTools.Metadata.Filter #endregion + #endregion + /// /// Validating combined key constructor /// diff --git a/SabreTools.Metadata.Filter/FilterObject.cs b/SabreTools.Metadata.Filter/FilterObject.cs index 4e95bc33..baeb6bb8 100644 --- a/SabreTools.Metadata.Filter/FilterObject.cs +++ b/SabreTools.Metadata.Filter/FilterObject.cs @@ -430,6 +430,77 @@ namespace SabreTools.Metadata.Filter } } + /// + /// Derive an operation from the input string, if possible + /// + private static Operation GetOperation(string? operation) + { + return operation?.ToLowerInvariant() switch + { + "=" => Operation.Equals, + "=:" => Operation.Equals, + "==" => Operation.Equals, + ":" => Operation.Equals, + "::" => Operation.Equals, + ":=" => Operation.Equals, + + "!" => Operation.NotEquals, + "!=" => Operation.NotEquals, + "!:" => Operation.NotEquals, + + ">" => Operation.GreaterThan, + ">:" => Operation.GreaterThanOrEqual, + ">=" => Operation.GreaterThanOrEqual, + "!<" => Operation.GreaterThanOrEqual, + + "<" => Operation.LessThan, + "<:" => Operation.LessThanOrEqual, + "<=" => Operation.LessThanOrEqual, + "!>" => Operation.LessThanOrEqual, + + _ => Operation.NONE, + }; + } + + /// + /// Derive a key, operation, and value from the input string, if possible + /// + private static bool SplitFilterString(string? filterString, out string? key, out Operation operation, out string? value) + { + // Set default values + key = null; operation = Operation.NONE; value = null; + + if (string.IsNullOrEmpty(filterString)) + return false; + + // Trim quotations, if necessary +#if NETCOREAPP || NETSTANDARD2_1_OR_GREATER + if (filterString!.StartsWith('\"')) + filterString = filterString[1..^1]; +#else + if (filterString!.StartsWith("\"")) + filterString = filterString.Substring(1, filterString.Length - 2); +#endif + + // Split the string using regex + var match = Regex.Match(filterString, @"^(?[a-zA-Z._]+)(?[=!:><]{1,2})(?.*)$", RegexOptions.Compiled); + if (!match.Success) + return false; + + key = match.Groups["itemField"].Value; + operation = GetOperation(match.Groups["operation"].Value); + + // Only non-zero length values are counted as non-null + if (match.Groups["value"]?.Value?.Length > 0) + value = match.Groups["value"].Value; + + return true; + } + + #endregion + + #region Per-Type Check Value Retrieval + /// /// Get the check value for a field /// @@ -2448,73 +2519,6 @@ namespace SabreTools.Metadata.Filter } } - /// - /// Derive an operation from the input string, if possible - /// - private static Operation GetOperation(string? operation) - { - return operation?.ToLowerInvariant() switch - { - "=" => Operation.Equals, - "=:" => Operation.Equals, - "==" => Operation.Equals, - ":" => Operation.Equals, - "::" => Operation.Equals, - ":=" => Operation.Equals, - - "!" => Operation.NotEquals, - "!=" => Operation.NotEquals, - "!:" => Operation.NotEquals, - - ">" => Operation.GreaterThan, - ">:" => Operation.GreaterThanOrEqual, - ">=" => Operation.GreaterThanOrEqual, - "!<" => Operation.GreaterThanOrEqual, - - "<" => Operation.LessThan, - "<:" => Operation.LessThanOrEqual, - "<=" => Operation.LessThanOrEqual, - "!>" => Operation.LessThanOrEqual, - - _ => Operation.NONE, - }; - } - - /// - /// Derive a key, operation, and value from the input string, if possible - /// - private static bool SplitFilterString(string? filterString, out string? key, out Operation operation, out string? value) - { - // Set default values - key = null; operation = Operation.NONE; value = null; - - if (string.IsNullOrEmpty(filterString)) - return false; - - // Trim quotations, if necessary -#if NETCOREAPP || NETSTANDARD2_1_OR_GREATER - if (filterString!.StartsWith('\"')) - filterString = filterString[1..^1]; -#else - if (filterString!.StartsWith("\"")) - filterString = filterString.Substring(1, filterString.Length - 2); -#endif - - // Split the string using regex - var match = Regex.Match(filterString, @"^(?[a-zA-Z._]+)(?[=!:><]{1,2})(?.*)$", RegexOptions.Compiled); - if (!match.Success) - return false; - - key = match.Groups["itemField"].Value; - operation = GetOperation(match.Groups["operation"].Value); - - // Only non-zero length values are counted as non-null - if (match.Groups["value"]?.Value?.Length > 0) - value = match.Groups["value"].Value; - - return true; - } - #endregion } }