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
}
}