public ApiScript Execute(ApiGlobalParent global)
        {
            ApiScript script = new ApiScript();

            try
            {
                if (this.EvaluatorVersion == EvaluatorVersion.Version_1)
                {
                    Script evaluator = GetScriptEvaluatorV1();

                    ScriptState result = evaluator.RunAsync(global as ApiGlobals).Result;

                    if (result.ReturnValue != null)
                    {
                        script.Data = JsonConvert.SerializeObject(result.ReturnValue);
                    }
                    else
                    {
                        script.Data = "script executed without any return";
                    }
                }
                else
                {
                    evaluator.Context           = global as ApiGlobalsCoreBase;
                    evaluator.EvaluateVariable += EvaluateVariable;
                    object o = evaluator.Execute(this.Script.Code.Trim());
                    script.Data = JsonConvert.SerializeObject(o);
                }
            }
            catch (Exception e)
            {
                if (e.InnerException is ExplicitExitException)
                {
                    throw e.InnerException;
                }
                else
                {
                    throw new Exception("Execution Error: " + e.Message);
                }
            }
            return(script);
        }
        public object ExecuteScript(EbApi Api, RabbitMqProducer mqp, Service service, EbStaticFileClient Fileclient)
        {
            ApiGlobalParent global;

            if (this.EvaluatorVersion == EvaluatorVersion.Version_1)
            {
                global = new ApiGlobals(Api.GlobalParams);
            }
            else
            {
                global = new ApiGlobalsCoreBase(Api.GlobalParams);
            }

            global.ResourceValueByIndexHandler += (index) =>
            {
                object resourceValue = Api.Resources[index].Result;

                if (resourceValue != null && resourceValue is string converted)
                {
                    if (converted.StartsWith("{") && converted.EndsWith("}") || converted.StartsWith("[") && converted.EndsWith("]"))
                    {
                        string formated = converted.Replace(@"\", string.Empty);
                        return(JObject.Parse(formated));
                    }
                }
                return(resourceValue);
            };

            global.ResourceValueByNameHandler += (name) =>
            {
                int index = Api.Resources.GetIndex(name);

                object resourceValue = Api.Resources[index].Result;

                if (resourceValue != null && resourceValue is string converted)
                {
                    if (converted.StartsWith("{") && converted.EndsWith("}") || converted.StartsWith("[") && converted.EndsWith("]"))
                    {
                        string formated = converted.Replace(@"\", string.Empty);
                        return(JObject.Parse(formated));
                    }
                }
                return(resourceValue);
            };

            global.GoToByIndexHandler += (index) =>
            {
                Api.Step = index;
                Api.Resources[index].Result = EbApiHelper.GetResult(Api.Resources[index], Api, mqp, service, Fileclient);
            };

            global.GoToByNameHandler += (name) =>
            {
                int index = Api.Resources.GetIndex(name);
                Api.Step = index;
                Api.Resources[index].Result = EbApiHelper.GetResult(Api.Resources[index], Api, mqp, service, Fileclient);
            };

            global.ExitResultHandler += (obj) =>
            {
                ApiScript script = new ApiScript
                {
                    Data = JsonConvert.SerializeObject(obj),
                };
                Api.ApiResponse.Result = script;
                Api.Step = Api.Resources.Count - 1;
            };

            ApiResources lastResource = Api.Step == 0 ? null : Api.Resources[Api.Step - 1];

            if (this.EvaluatorVersion == EvaluatorVersion.Version_1 && lastResource?.Result is EbDataSet dataSet)
            {
                (global as ApiGlobals).Tables = dataSet.Tables;
            }

            ApiScript result;

            try
            {
                result = this.Execute(global);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return(result);
        }