/** * 供 type: fun 的 method 桥接:adb-* → adb-parser;json-to-arr / json-json-to-arr → json-to-arr.js */ const path = require('path') const adbParserExecute = require(path.join(__dirname, 'adb', 'adb-parser.js')).execute const ADB_SUBMETHODS = new Set([ 'input', 'click', 'locate', 'swipe', 'scroll', 'keyevent', 'press', 'string-press', 'send-img-to-device', ]) function buildSyntheticAdbAction (action, adbMethod) { return { type: 'adb', method: adbMethod, inVars: Array.isArray(action.inVars) ? action.inVars : [], outVars: Array.isArray(action.outVars) ? action.outVars : [], target: action.target, value: action.value, variable: action.variable, clear: action.clear, area: action.area, avatar: action.avatar, } } function buildAdbExecuteCtx (ctx, device, folderPath) { const resolution = ctx.resolution || { width: 1080, height: 1920 } return { device, folderPath, resolution, variableContext: ctx.variableContext, api: ctx.electronAPI, extractVarName: ctx.extractVarName, resolveValue: ctx.resolveValue, logOutVars: ctx.logOutVars, DEFAULT_SCROLL_DISTANCE: ctx.DEFAULT_SCROLL_DISTANCE ?? 100, } } /** * @returns {Promise} null 表示非桥接 method,由 run() 继续分发 */ async function runFunBridgedMethod (actionType, action, ctx, device, folderPath) { if (typeof actionType !== 'string') return null if (actionType.startsWith('adb-')) { const sub = actionType.slice(4) if (!ADB_SUBMETHODS.has(sub)) { return { success: false, error: `未知的 fun.method adb 子命令: ${sub}(支持: ${[...ADB_SUBMETHODS].join(', ')})` } } const syn = buildSyntheticAdbAction(action, sub) const adbCtx = buildAdbExecuteCtx(ctx, device, folderPath) return adbParserExecute(syn, adbCtx) } if (actionType === 'json-to-arr' || actionType === 'json-json-to-arr') { const { executeJsonToArr } = require(path.join(__dirname, 'json', 'json-to-arr.js')) const jsonString = action.inVars && action.inVars.length > 0 ? action.inVars[0] : undefined const result = await executeJsonToArr({ jsonString }) if (!result.success) return { success: false, error: result.error } const { extractVarName, variableContext, logOutVars } = ctx const outputVarName = action.outVars && action.outVars.length > 0 ? extractVarName(String(action.outVars[0]).trim()) : null if (outputVarName && Array.isArray(result.result)) variableContext[outputVarName] = result.result await logOutVars(action, variableContext, folderPath) return { success: true, ...result } } return null } module.exports = { runFunBridgedMethod, ADB_SUBMETHODS }