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.ArrayList; 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); List initializedMods = new ArrayList<>(); for (ScriptCraftEntrypoint mod : mods) { if (MOD_ID_PATTERN.matcher(mod.getModID()).matches()) { mod.registerBridges(); initializedMods.add(mod); } else { System.err.println("Invalid Mod ID: " + mod.getModID()); } } for (ScriptCraftEntrypoint mod : initializedMods) { quickjs.run("import '" + mod.getModID() + "';"); } return null; } }); } }