random-parser.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. /** 语句:random 生成随机数 */
  2. const types = ['random']
  3. function parse(action, parseContext) {
  4. const { extractVarName } = parseContext
  5. const parsed = { type: 'random', integer: action.integer !== undefined ? action.integer : true }
  6. if (action.inVars && Array.isArray(action.inVars) && action.inVars.length >= 2) {
  7. parsed.min = action.inVars[0]
  8. parsed.max = action.inVars[1]
  9. } else {
  10. parsed.min = action.min
  11. parsed.max = action.max
  12. }
  13. if (action.outVars && Array.isArray(action.outVars) && action.outVars.length > 0) {
  14. parsed.variable = action.outVars[0]
  15. } else parsed.variable = action.variable
  16. return Object.assign({}, action, parsed)
  17. }
  18. async function execute(action, ctx) {
  19. const { variableContext, extractVarName } = ctx
  20. let varName
  21. if (action.outVars && action.outVars.length > 0) {
  22. varName = extractVarName(action.outVars[0])
  23. } else if (action.variable) {
  24. varName = extractVarName(action.variable)
  25. } else {
  26. return { success: false, error: 'random 操作缺少 variable 或 outVars 参数' }
  27. }
  28. let min, max
  29. if (action.inVars && action.inVars.length >= 2) {
  30. min = Number(action.inVars[0])
  31. max = Number(action.inVars[1])
  32. } else {
  33. min = action.min !== undefined ? Number(action.min) : 0
  34. max = action.max !== undefined ? Number(action.max) : 100
  35. }
  36. const integer = action.integer !== undefined ? action.integer : true
  37. if (isNaN(min) || isNaN(max)) return { success: false, error: 'random 操作的 min 和 max 必须是数字' }
  38. if (min > max) return { success: false, error: 'random 操作的 min 不能大于 max' }
  39. const randomValue = integer
  40. ? Math.floor(Math.random() * (max - min + 1)) + min
  41. : Math.random() * (max - min) + min
  42. variableContext[varName] = randomValue
  43. return { success: true }
  44. }
  45. module.exports = { types, parse, execute }