public override IEnumerable <ExpressionResult> RunInternal(ExpressionContext context) { if (context.GetFunction(Name) is not Expression expression) { yield break; } var captureName = CaptureName ?? new("!F"); context.CaptureTree.Open(captureName); context.CaptureTree.Current !.IsFunctionBoundary = true; context.CallStack.Push(new(Name)); foreach (var result in expression.Run(context)) { var frame = context.CallStack.Pop(); context.CaptureTree.Close(captureName, result); yield return(result); context.CaptureTree.Unclose(captureName); frame.Ratchet = false; context.CallStack.Push(frame); } context.CallStack.Pop(); context.CaptureTree.Unopen(captureName); }
/*****************************************************************************/ public object Evaluate(ExpressionContext context) { var func = context.ExtensionFunctions.GetFunction(_functionName, _parameters.Count()); if (func != null) { return(func.Evaluate(_parameters, context)); } var tfunc = context.GetFunction(_functionName); if (tfunc != null) { var output = JObject.Parse("{}"); var funcContext = new ExpressionContext(context.Data, context, context.Templates, context.Functions); var index = 0; foreach (var argName in tfunc.Parameters) { if (index >= _parameters.Count) { break; } funcContext.SetVariable(argName, _parameters[index++].Evaluate(context)); } tfunc.Evaluate(output, funcContext); if (output["return"] != null) { return(output["return"]); } return(output.ToString().JsonToExpando()); } throw new Transformer.SyntaxException($"A function with that name and number of parameters was not found : {_functionName}"); }