mirror of
https://github.com/litruv/picoGraph.git
synced 2026-07-24 02:36:04 +10:00
92 lines
2.5 KiB
JavaScript
92 lines
2.5 KiB
JavaScript
import { createNodeModule } from "../../nodeTypes.js";
|
|
|
|
/**
|
|
* Resumes a coroutine and exposes the success flag and first result.
|
|
*/
|
|
export const luaCoroutineResumeNode = createNodeModule(
|
|
{
|
|
id: "lua_coroutine_resume",
|
|
title: "Coroutine Resume",
|
|
category: "Lua",
|
|
description:
|
|
"Resume a coroutine and capture the success flag alongside the first returned value.",
|
|
searchTags: ["coroutine", "resume", "lua"],
|
|
inputs: [
|
|
{ id: "exec_in", name: "Exec", direction: "input", kind: "exec" },
|
|
{
|
|
id: "coroutine",
|
|
name: "Coroutine",
|
|
direction: "input",
|
|
kind: "any",
|
|
},
|
|
{
|
|
id: "arg1",
|
|
name: "Arg 1",
|
|
direction: "input",
|
|
kind: "any",
|
|
description: "Optional first value passed to coroutine",
|
|
},
|
|
{
|
|
id: "arg2",
|
|
name: "Arg 2",
|
|
direction: "input",
|
|
kind: "any",
|
|
description: "Optional second value passed to coroutine",
|
|
},
|
|
],
|
|
outputs: [
|
|
{ id: "exec_out", name: "Exec", direction: "output", kind: "exec" },
|
|
{
|
|
id: "success",
|
|
name: "Success",
|
|
direction: "output",
|
|
kind: "boolean",
|
|
},
|
|
{
|
|
id: "result",
|
|
name: "Result",
|
|
direction: "output",
|
|
kind: "any",
|
|
},
|
|
],
|
|
properties: [],
|
|
},
|
|
{
|
|
emitExec: ({
|
|
node,
|
|
indent,
|
|
indentLevel,
|
|
resolveValueInput,
|
|
sanitizeIdentifier,
|
|
emitNextExec,
|
|
}) => {
|
|
const OMIT = "__pg_omit__";
|
|
const target = resolveValueInput("coroutine", "nil");
|
|
const arg1 = resolveValueInput("arg1", OMIT);
|
|
const arg2 = resolveValueInput("arg2", OMIT);
|
|
const args = [target];
|
|
if (arg1 !== OMIT) {
|
|
args.push(arg1);
|
|
}
|
|
if (arg2 !== OMIT) {
|
|
args.push(arg2);
|
|
}
|
|
const successName = sanitizeIdentifier(`__pg_${node.id}_co_success`);
|
|
const resultName = sanitizeIdentifier(`__pg_${node.id}_co_result`);
|
|
const line = `${indent(indentLevel)}local ${successName}, ${resultName} = coroutine.resume(${args.join(", ")})`;
|
|
return [line, ...emitNextExec("exec_out")];
|
|
},
|
|
evaluateValue: ({ node, pinId, sanitizeIdentifier }) => {
|
|
const successName = sanitizeIdentifier(`__pg_${node.id}_co_success`);
|
|
const resultName = sanitizeIdentifier(`__pg_${node.id}_co_result`);
|
|
if (pinId === "success") {
|
|
return successName;
|
|
}
|
|
if (pinId === "result") {
|
|
return resultName;
|
|
}
|
|
return "nil";
|
|
},
|
|
}
|
|
);
|