using System.Collections.Generic; using SabreTools.Core; using SabreTools.Core.Tools; using SabreTools.Logging; namespace SabreTools.Filtering { /// /// Represents the filtering operations that need to be performed on a DatHeader /// /// TODO: Investigate how to reduce the amount of hardcoded filter statements /// TODO: Add DatHeader filters public class DatHeaderFilter { #region Logging /// /// Logging object /// private readonly Logger logger; #endregion #region Constructors /// /// Constructor /// public DatHeaderFilter() { logger = new Logger(this); } #endregion #region Filter Population /// /// 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) { foreach (string filterPair in filters) { // 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."); 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); } } /// /// Set multiple filters from key /// /// Key for the filter to be set /// List of values for the filter /// True if negative filter, false otherwise public void SetFilter(DatHeaderField key, List values, bool negate) { foreach (string value in values) { SetFilter(key, value, negate); } } /// /// Set a single filter from key /// /// Key for the filter to be set /// Value of the filter /// True if negative filter, false otherwise public void SetFilter(DatHeaderField key, string value, bool negate) { switch (key) { // TODO: Add DatHeader filters } } #endregion } }