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 net.fabricmc.api.ModInitializer; import net.fabricmc.loader.api.FabricLoader; import java.util.HashMap; import java.util.List; import java.util.regex.Pattern; @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"; public static final Pattern MOD_ID_PATTERN = Pattern.compile("[a-z][a-z0-9-_]{1,63}"); @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; } }); } }