private static (object, string) Evaluator(Expression expression, object state, Options options)
        {
            object result = null;
            string error;
            object instance;

            (instance, error) = expression.Children[0].TryEvaluate(state, options);
            if (error == null)
            {
                if (FunctionUtils.TryParseList(instance, out var list))
                {
                    var tempList = new List <object>();
                    for (var i = 0; i < list.Count; i++)
                    {
                        tempList.Add(new { index = i, value = list[i] });
                    }

                    result = tempList;
                }
                else if (instance is JObject jobj)
                {
                    result = Object2List(jobj);
                }
                else if (FunctionUtils.ConvertToJToken(instance) is JObject jobject)
                {
                    result = Object2List(jobject);
                }
                else
                {
                    error = $"{expression.Children[0]} is not array or object..";
                }
            }

            return(result, error);
        }
        private static EvaluateExpressionDelegate Evaluator()
        {
            return(FunctionUtils.ApplySequenceWithError(args =>
            {
                object result = null;
                string error = null;
                var arg0 = FunctionUtils.ConvertToJToken(args[0]);
                var arg1 = FunctionUtils.ConvertToJToken(args[1]);
                if (arg0 is JObject && arg1 is JObject)
                {
                    (arg0 as JObject).Merge(arg1 as JObject, new JsonMergeSettings
                    {
                        MergeArrayHandling = MergeArrayHandling.Replace
                    });

                    result = arg0;
                }
                else
                {
                    error = $"The arguments {args[0]} and {args[1]} must be a JSON objects.";
                }

                return (result, error);
            }));
        }
Exemplo n.º 3
0
 private static EvaluateExpressionDelegate Evaluator()
 {
     return(FunctionUtils.Apply(args =>
     {
         var newJobj = (IDictionary <string, JToken>)args[0];
         newJobj[args[1].ToString()] = FunctionUtils.ConvertToJToken(args[2]);
         return newJobj;
     }));
 }
        private static (object value, string error) Evaluator(Expression expression, IMemory state, Options options)
        {
            object result = null;
            string error;

            object instance;

            (instance, error) = expression.Children[0].TryEvaluate(state, options);
            if (error == null)
            {
                var list = FunctionUtils.ConvertToList(instance);
                if (list == null)
                {
                    error = $"{expression.Children[0]} is not a collection or structure object to run Where";
                }
                else
                {
                    result = new List <object>();
                    FunctionUtils.LambdaEvaluator(expression, state, options, list, (object currentItem, object r, string e) =>
                    {
                        if (FunctionUtils.IsLogicTrue(r) && e == null)
                        {
                            // add if only if it evaluates to true
                            ((List <object>)result).Add(currentItem);
                        }

                        return(false);
                    });

                    if (!FunctionUtils.TryParseList(instance, out IList _))
                    {
                        // re-construct object
                        var jobjResult = new JObject();
                        foreach (var item in (List <object>)result)
                        {
                            FunctionUtils.TryAccessProperty(item, "key", out var keyVal);
                            FunctionUtils.TryAccessProperty(item, "value", out var val);
                            jobjResult.Add(keyVal as string, FunctionUtils.ConvertToJToken(val));
                        }

                        result = jobjResult;
                    }
                }
            }

            return(result, error);
        }
Exemplo n.º 5
0
        private static EvaluateExpressionDelegate Evaluator()
        {
            return(FunctionUtils.ApplyWithError(args =>
            {
                var newJobj = (IDictionary <string, JToken>)args[0];
                var prop = args[1].ToString();
                string error = null;
                if (newJobj.ContainsKey(prop))
                {
                    error = $"{prop} already exists";
                }
                else
                {
                    newJobj[prop] = FunctionUtils.ConvertToJToken(args[2]);
                }

                return (newJobj, error);
            }));
        }
Exemplo n.º 6
0
        private static (List <JObject>, string) ParseToObjectList(object arg)
        {
            var    result = new List <JObject>();
            string error  = null;

            if (arg == null)
            {
                error = $"The argument {arg} must be a JSON object or array.";
            }
            else if (FunctionUtils.TryParseList(arg, out var array))
            {
                var jarray = JArray.FromObject(array);
                foreach (var jtoken in jarray)
                {
                    if (jtoken is JObject jobj)
                    {
                        result.Add(jobj);
                    }
                    else
                    {
                        error = $"The argument {jtoken} in array must be a JSON object.";
                        break;
                    }
                }
            }
            else
            {
                var jtoken = FunctionUtils.ConvertToJToken(arg);
                if (jtoken is JObject jobj)
                {
                    result.Add(jobj);
                }
                else
                {
                    error = $"The argument {arg} must be a JSON object or array.";
                }
            }

            return(result, error);
        }
        private (object result, string error) SetProperty(object instance, string property, object value)
        {
            var    result = value;
            string error  = null;

            if (instance is IDictionary <string, object> idict)
            {
                idict[property] = value;
            }
            else if (instance is IDictionary dict)
            {
                dict[property] = value;
            }
            else if (instance is JObject jobj)
            {
                jobj[property] = FunctionUtils.ConvertToJToken(value);
            }
            else
            {
                // Use reflection
                var type = instance.GetType();
                var prop = type.GetProperties().Where(p => p.Name.ToLower() == property).SingleOrDefault();
                if (prop != null)
                {
                    if (prop.CanWrite)
                    {
                        prop.SetValue(instance, value);
                    }
                    else
                    {
                        error = $"property {prop.Name} is read-only";
                    }
                }
            }

            return(result, error);
        }
Exemplo n.º 8
0
        private static (object value, string error) Evaluator(Expression expression, IMemory state, Options options)
        {
            object result = null;
            string error;

            object instance;

            (instance, error) = expression.Children[0].TryEvaluate(state, options);
            if (error == null)
            {
                var   isInstanceList = false;
                IList list           = null;
                if (FunctionUtils.TryParseList(instance, out IList ilist))
                {
                    isInstanceList = true;
                    list           = ilist;
                }
                else if (instance is JObject jobj)
                {
                    list = FunctionUtils.Object2KVPairList(jobj);
                }
                else if (FunctionUtils.ConvertToJToken(instance) is JObject jobject)
                {
                    list = FunctionUtils.Object2KVPairList(jobject);
                }
                else
                {
                    error = $"{expression.Children[0]} is not a collection or structure object to run foreach";
                }

                if (error == null)
                {
                    var iteratorName  = (string)(expression.Children[1].Children[0] as Constant).Value;
                    var stackedMemory = StackedMemory.Wrap(state);
                    result = new List <object>();
                    for (var idx = 0; idx < list.Count; idx++)
                    {
                        var local = new Dictionary <string, object>
                        {
                            { iteratorName, FunctionUtils.AccessIndex(list, idx).value },
                        };

                        // the local iterator is pushed as one memory layer in the memory stack
                        stackedMemory.Push(new SimpleObjectMemory(local));
                        var(r, e) = expression.Children[2].TryEvaluate(stackedMemory, new Options(options)
                        {
                            NullSubstitution = null
                        });
                        stackedMemory.Pop();

                        if (FunctionUtils.IsLogicTrue(r) && e == null)
                        {
                            // add if only if it evaluates to true
                            ((List <object>)result).Add(local[iteratorName]);
                        }
                    }

                    if (!isInstanceList)
                    {
                        // re-construct object
                        var jobjResult = new JObject();
                        foreach (var item in (List <object>)result)
                        {
                            FunctionUtils.TryAccessProperty(item, "key", out var keyVal);
                            FunctionUtils.TryAccessProperty(item, "value", out var val);
                            jobjResult.Add(keyVal as string, FunctionUtils.ConvertToJToken(val));
                        }

                        result = jobjResult;
                    }
                }
            }

            return(result, error);
        }