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); })); }
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); }
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); })); }
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); }
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); }