set-parser.js 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. /** 语句:set 设置变量 */
  2. const types = ['set']
  3. function parse(action, parseContext) {
  4. const { extractVarName, resolveValue } = parseContext
  5. const parsed = {
  6. type: 'set',
  7. variable: action.variable,
  8. value: resolveValue(action.value, parseContext.variableContext || {}),
  9. }
  10. return Object.assign({}, action, parsed)
  11. }
  12. async function execute(action, ctx) {
  13. const { variableContext, extractVarName, resolveValue, evaluateExpression } = ctx
  14. if (!action.variable) return { success: true }
  15. const varName = extractVarName(action.variable)
  16. let finalValue = action.value
  17. if (typeof action.value === 'string' && /[+\-*/]/.test(action.value)) {
  18. finalValue = evaluateExpression(action.value, variableContext)
  19. } else if (typeof action.value === 'string') {
  20. const varPattern = /\{([\w-]+)\}/g
  21. let hasVariables = false
  22. finalValue = action.value.replace(varPattern, (match, vn) => {
  23. hasVariables = true
  24. const val = variableContext[vn]
  25. return val === undefined || val === null ? match : String(val)
  26. })
  27. if (!hasVariables) finalValue = resolveValue(action.value, variableContext)
  28. } else {
  29. finalValue = resolveValue(action.value, variableContext)
  30. }
  31. variableContext[varName] = finalValue
  32. return { success: true }
  33. }
  34. module.exports = { types, parse, execute }