浏览代码

支持`import`接口

mxd 4 年之前
父节点
当前提交
fb78f2ce77
共有 1 个文件被更改,包括 30 次插入5 次删除
  1. 30 5
      src/main/java/org/ssssssss/magicapi/provider/impl/DefaultMagicAPIService.java

+ 30 - 5
src/main/java/org/ssssssss/magicapi/provider/impl/DefaultMagicAPIService.java

@@ -6,8 +6,12 @@ import org.ssssssss.magicapi.model.ApiInfo;
 import org.ssssssss.magicapi.provider.MagicAPIService;
 import org.ssssssss.magicapi.provider.ResultProvider;
 import org.ssssssss.magicapi.script.ScriptManager;
+import org.ssssssss.script.MagicResourceLoader;
 import org.ssssssss.script.MagicScript;
 import org.ssssssss.script.MagicScriptContext;
+import org.ssssssss.script.parsing.Scope;
+import org.ssssssss.script.parsing.Span;
+import org.ssssssss.script.parsing.ast.Expression;
 
 import javax.script.ScriptContext;
 import javax.script.SimpleScriptContext;
@@ -25,6 +29,31 @@ public class DefaultMagicAPIService implements MagicAPIService {
 		this.mappingHandlerMapping = mappingHandlerMapping;
 		this.resultProvider = resultProvider;
 		this.throwException = throwException;
+		MagicResourceLoader.addFunctionLoader((name) -> {
+			int index = name.indexOf(":");
+			if (index > -1) {
+				String method = name.substring(0, index);
+				String path = name.substring(index + 1);
+				ApiInfo info = this.mappingHandlerMapping.getApiInfo(method, path);
+				if (info != null) {
+					return new Expression(new Span("unknown source")) {
+						@Override
+						public Object evaluate(MagicScriptContext context, Scope scope) {
+							return execute(info, scope.getVariables());
+						}
+					};
+				}
+			}
+			return null;
+		});
+	}
+
+	private Object execute(ApiInfo info, Map<String, Object> context) {
+		MagicScriptContext scriptContext = new MagicScriptContext();
+		scriptContext.putMapIntoContext(context);
+		SimpleScriptContext simpleScriptContext = new SimpleScriptContext();
+		simpleScriptContext.setAttribute(MagicScript.CONTEXT_ROOT, scriptContext, ScriptContext.ENGINE_SCOPE);
+		return ScriptManager.compile("MagicScript", info.getScript()).eval(simpleScriptContext);
 	}
 
 	@Override
@@ -33,11 +62,7 @@ public class DefaultMagicAPIService implements MagicAPIService {
 		if (info == null) {
 			throw new MagicServiceException(String.format("找不到对应接口 [%s:%s]", method, path));
 		}
-		MagicScriptContext scriptContext = new MagicScriptContext();
-		scriptContext.putMapIntoContext(context);
-		SimpleScriptContext simpleScriptContext = new SimpleScriptContext();
-		simpleScriptContext.setAttribute(MagicScript.CONTEXT_ROOT, scriptContext, ScriptContext.ENGINE_SCOPE);
-		return ScriptManager.compile("MagicScript", info.getScript()).eval(simpleScriptContext);
+		return execute(info, context);
 	}
 
 	@Override