using System.Text.Json;
namespace Workflow.Domain.Expressions.Comparators;
///
/// 数值对比器。处理 ==, !=, >, <, >=, <= 操作符。
/// 仅当两个值都能解析为 decimal 时才进行比较,否则返回 false。
///
public class NumericComparator : IValueComparator
{
private static readonly IReadOnlySet _supportedOperators = new HashSet
{
"==", "!=", ">", "<", ">=", "<="
};
public IReadOnlySet SupportedOperators => _supportedOperators;
public bool Compare(object? fieldValue, string operatorName, object? conditionValue)
{
if (fieldValue is null || !_supportedOperators.Contains(operatorName))
return false;
if (!ValueComparatorHelper.TryGetDecimal(fieldValue, out var fieldNum))
return false;
if (!ValueComparatorHelper.TryGetDecimalFromCondition(conditionValue, out var condNum))
return false;
return operatorName switch
{
"==" => fieldNum == condNum,
"!=" => fieldNum != condNum,
">" => fieldNum > condNum,
"<" => fieldNum < condNum,
">=" => fieldNum >= condNum,
"<=" => fieldNum <= condNum,
_ => false
};
}
}