mirror of
https://github.com/claunia/SabreTools.git
synced 2025-12-16 19:14:27 +00:00
100 lines
3.4 KiB
C#
100 lines
3.4 KiB
C#
|
|
using System.Collections.Generic;
|
||
|
|
|
||
|
|
using SabreTools.Core;
|
||
|
|
using SabreTools.Core.Tools;
|
||
|
|
using SabreTools.Logging;
|
||
|
|
|
||
|
|
namespace SabreTools.Filtering
|
||
|
|
{
|
||
|
|
/// <summary>
|
||
|
|
/// Represents the filtering operations that need to be performed on a DatHeader
|
||
|
|
/// </summary>
|
||
|
|
/// TODO: Investigate how to reduce the amount of hardcoded filter statements
|
||
|
|
/// TODO: Add DatHeader filters
|
||
|
|
public class DatHeaderFilter
|
||
|
|
{
|
||
|
|
#region Logging
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// Logging object
|
||
|
|
/// </summary>
|
||
|
|
private readonly Logger logger;
|
||
|
|
|
||
|
|
#endregion
|
||
|
|
|
||
|
|
#region Constructors
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// Constructor
|
||
|
|
/// </summary>
|
||
|
|
public DatHeaderFilter()
|
||
|
|
{
|
||
|
|
logger = new Logger(this);
|
||
|
|
}
|
||
|
|
|
||
|
|
#endregion
|
||
|
|
|
||
|
|
#region Filter Population
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// Populate the filters object using a set of key:value filters
|
||
|
|
/// </summary>
|
||
|
|
/// <param name="filters">List of key:value where ~key/!key is negated</param>
|
||
|
|
public void PopulateFromList(List<string> 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);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// Set multiple filters from key
|
||
|
|
/// </summary>
|
||
|
|
/// <param name="key">Key for the filter to be set</param>
|
||
|
|
/// <param name="values">List of values for the filter</param>
|
||
|
|
/// <param name="negate">True if negative filter, false otherwise</param>
|
||
|
|
public void SetFilter(DatHeaderField key, List<string> values, bool negate)
|
||
|
|
{
|
||
|
|
foreach (string value in values)
|
||
|
|
{
|
||
|
|
SetFilter(key, value, negate);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// Set a single filter from key
|
||
|
|
/// </summary>
|
||
|
|
/// <param name="key">Key for the filter to be set</param>
|
||
|
|
/// <param name="value">Value of the filter</param>
|
||
|
|
/// <param name="negate">True if negative filter, false otherwise</param>
|
||
|
|
public void SetFilter(DatHeaderField key, string value, bool negate)
|
||
|
|
{
|
||
|
|
switch (key)
|
||
|
|
{
|
||
|
|
// TODO: Add DatHeader filters
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
#endregion
|
||
|
|
}
|
||
|
|
}
|