package com.thebrokenrail.scriptcraft.core; import com.thebrokenrail.scriptcraft.core.quickjs.JSException; import com.thebrokenrail.scriptcraft.core.quickjs.QuickJSNative; import com.thebrokenrail.scriptcraft.core.quickjs.QuickJSManager; import com.thebrokenrail.scriptcraft.core.util.Bridge; import com.thebrokenrail.scriptcraft.core.util.ScriptCraftEntryPoint; import net.fabricmc.api.ModInitializer; import net.fabricmc.loader.api.FabricLoader; import java.util.HashMap; import java.util.List; @SuppressWarnings("unused") public class ScriptCraftCore implements ModInitializer { private static final HashMap bridges = new HashMap<>(); public static void addBridge(String name, Bridge bridge) { bridges.put(name, bridge); } public static Object useBridgeNative(String name, Object... args) { QuickJSManager.Task task = new QuickJSManager.Task() { @Override protected Object run(QuickJSNative quickjs) { if (bridges.containsKey(name)) { return bridges.get(name).use(args); } else { throw new RuntimeException("Invalid Bridge: '" + name + '\''); } } }; return QuickJSManager.sendTaskFromQuickJS(task); } public static Object useBridge(String method, Object... args) { QuickJSManager.Task task = new QuickJSManager.Task() { @Override protected Object run(QuickJSNative quickjs) throws JSException { return quickjs.bridge(method, args); } }; return QuickJSManager.sendTaskToQuickJS(task); } public static final String NAMESPACE = "scriptcraft"; @Override public void onInitialize() { QuickJSManager.init(new QuickJSManager.Task() { @Override protected Object run(QuickJSNative quickjs) { List mods = FabricLoader.getInstance().getEntrypoints(NAMESPACE, ScriptCraftEntryPoint.class); for (ScriptCraftEntryPoint mod : mods) { mod.registerBridges(); } for (ScriptCraftEntryPoint mod : mods) { quickjs.run(mod.getEntryPoint()); } return null; } }); } }