コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }