public override FilterNode <ClrValue> Visit(CompareFilter <IJsonValue> nodeIn) { CompareFilter <ClrValue> result = null; if (nodeIn.Path.TryGetProperty(schema, errors, out var property)) { var isValidOperator = OperatorValidator.IsAllowedOperator(property, nodeIn.Operator); if (!isValidOperator) { errors.Add($"{nodeIn.Operator} is not a valid operator for type {property.Type} at {nodeIn.Path}."); } var value = ValueConverter.Convert(property, nodeIn.Value, nodeIn.Path, errors); if (value != null && isValidOperator) { if (value.IsList && nodeIn.Operator != CompareOperator.In) { errors.Add($"Array value is not allowed for '{nodeIn.Operator}' operator and path '{nodeIn.Path}'."); } result = new CompareFilter <ClrValue>(nodeIn.Path, nodeIn.Operator, value); } } result = result ?? new CompareFilter <ClrValue>(nodeIn.Path, nodeIn.Operator, ClrValue.Null); return(result); }
public override FilterNode <ClrValue> Visit(CompareFilter <IJsonValue> nodeIn, Args args) { CompareFilter <ClrValue>?result = null; if (nodeIn.Path.TryGetProperty(args.Schema, args.Errors, out var property)) { var isValidOperator = OperatorValidator.IsAllowedOperator(property, nodeIn.Operator); if (!isValidOperator) { var name = property.Type.ToString(); if (!string.IsNullOrWhiteSpace(property.Format)) { name = $"{name}({property.Format})"; } args.Errors.Add($"'{nodeIn.Operator}' is not a valid operator for type {name} at '{nodeIn.Path}'."); } var value = ValueConverter.Convert(property, nodeIn.Value, nodeIn.Path, args.Errors); if (value != null && isValidOperator) { if (nodeIn.Operator == CompareOperator.In) { if (!value.IsList) { value = value.ToList(); } } else { if (value.IsList) { args.Errors.Add($"Array value is not allowed for '{nodeIn.Operator}' operator and path '{nodeIn.Path}'."); } } if (nodeIn.Operator == CompareOperator.Matchs && value.Value?.ToString()?.IsValidRegex() != true) { args.Errors.Add($"{value} is not a valid regular expression."); } result = new CompareFilter <ClrValue>(nodeIn.Path, nodeIn.Operator, value); } } result ??= new CompareFilter <ClrValue>(nodeIn.Path, nodeIn.Operator, ClrValue.Null); return(result); }