random-parser.js 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. /** 语句:random 生成随机数(仅 inVars[0]=min、inVars[1]=max,outVars[0]=目标变量名) */
  2. const { assertStrictKeys } = require('../action-schema.js')
  3. const types = ['random']
  4. function parse (action, parseContext) {
  5. const { extractVarName } = parseContext
  6. const path = parseContext.actionPath || 'random'
  7. assertStrictKeys(action, ['type', 'inVars', 'outVars', 'integer'], path)
  8. if (!Array.isArray(action.inVars) || action.inVars.length !== 2) {
  9. throw new Error(`${path}: random 须 inVars 恰好 2 项 [min, max]`)
  10. }
  11. if (!Array.isArray(action.outVars) || action.outVars.length !== 1) {
  12. throw new Error(`${path}: random 须 outVars 恰好 1 项(写入变量名,如 "{x}")`)
  13. }
  14. const integer = action.integer !== undefined ? action.integer : true
  15. return {
  16. type: 'random',
  17. integer,
  18. min: action.inVars[0],
  19. max: action.inVars[1],
  20. inVars: action.inVars.map((v) => extractVarName(v)),
  21. outVars: [extractVarName(action.outVars[0])],
  22. variable: extractVarName(action.outVars[0]),
  23. }
  24. }
  25. async function execute(action, ctx) {
  26. const { variableContext, extractVarName } = ctx
  27. let varName
  28. if (action.outVars && action.outVars.length > 0) {
  29. varName = extractVarName(action.outVars[0])
  30. } else if (action.variable) {
  31. varName = extractVarName(action.variable)
  32. } else {
  33. return { success: false, error: 'random 操作缺少 variable 或 outVars 参数' }
  34. }
  35. let min, max
  36. if (action.inVars && action.inVars.length >= 2) {
  37. min = Number(action.inVars[0])
  38. max = Number(action.inVars[1])
  39. } else {
  40. min = action.min !== undefined ? Number(action.min) : 0
  41. max = action.max !== undefined ? Number(action.max) : 100
  42. }
  43. const integer = action.integer !== undefined ? action.integer : true
  44. if (isNaN(min) || isNaN(max)) return { success: false, error: 'random 操作的 min 和 max 必须是数字' }
  45. if (min > max) return { success: false, error: 'random 操作的 min 不能大于 max' }
  46. const randomValue = integer
  47. ? Math.floor(Math.random() * (max - min + 1)) + min
  48. : Math.random() * (max - min) + min
  49. variableContext[varName] = randomValue
  50. return { success: true }
  51. }
  52. module.exports = { types, parse, execute }