mirror of
https://gitee.com/langsisi_admin/serein-flow
synced 2026-04-02 14:36:33 +08:00
为Script提供了SereinScript.ExecuteAsync执行脚本文本内容的静态方法。
This commit is contained in:
@@ -4,10 +4,21 @@ namespace Serein.Script
|
||||
{
|
||||
public class ScriptInvokeContext : IScriptInvokeContext
|
||||
{
|
||||
/// <summary>
|
||||
/// 脚本使用流程上下文
|
||||
/// </summary>
|
||||
/// <param name="dynamicContext"></param>
|
||||
public ScriptInvokeContext(IDynamicContext dynamicContext)
|
||||
{
|
||||
FlowContext = dynamicContext;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 不使用流程上下文
|
||||
/// </summary>
|
||||
public ScriptInvokeContext()
|
||||
{
|
||||
}
|
||||
|
||||
public IDynamicContext FlowContext{ get; }
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using Serein.Library;
|
||||
using Serein.Library.Api;
|
||||
using Serein.Script.Node;
|
||||
using Serein.Script.Node.FlowControl;
|
||||
using System;
|
||||
@@ -15,6 +16,9 @@ namespace Serein.Script
|
||||
|
||||
public class SereinScript
|
||||
{
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 类型分析
|
||||
/// </summary>
|
||||
@@ -24,6 +28,21 @@ namespace Serein.Script
|
||||
|
||||
private ProgramNode? programNode;
|
||||
|
||||
|
||||
public static Task<object?> ExecuteAsync(string script, Dictionary<string, Type>? argTypes = null)
|
||||
{
|
||||
SereinScriptParser parser = new SereinScriptParser();
|
||||
SereinScriptTypeAnalysis analysis = new SereinScriptTypeAnalysis();
|
||||
var programNode = parser.Parse(script);
|
||||
analysis.NodeSymbolInfos.Clear(); // 清空符号表
|
||||
if (argTypes is not null) analysis.LoadSymbol(argTypes); // 提前加载脚本节点定义的符号
|
||||
analysis.Analysis(programNode); // 分析节点类型
|
||||
SereinScriptInterpreter Interpreter = new SereinScriptInterpreter(analysis.NodeSymbolInfos);
|
||||
IScriptInvokeContext context = new ScriptInvokeContext();
|
||||
var task = Interpreter.InterpreterAsync(context, programNode);
|
||||
return task; // 脚本返回类型
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 解析脚本
|
||||
/// </summary>
|
||||
|
||||
@@ -295,7 +295,7 @@ namespace Serein.Script
|
||||
async Task<object?> InterpreterFunctionCallNodeAsync(IScriptInvokeContext context, FunctionCallNode functionCallNode)
|
||||
{
|
||||
// 获取流程上下文
|
||||
if (functionCallNode.FunctionName.Equals("getFlowApi", StringComparison.OrdinalIgnoreCase))
|
||||
if (context.FlowContext != null && functionCallNode.FunctionName.Equals("getFlowApi", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return context.FlowContext;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user