parameter_resolver.py 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. import re
  2. from typing import Any
  3. from app.service.engine.execution_context import ExecutionContext
  4. _ARRAY_COMBINE_RE = re.compile(r"^\[(.*)?\]$")
  5. class ParameterResolver:
  6. def resolve(self, value: Any, context: ExecutionContext) -> Any:
  7. if value is None:
  8. return None
  9. if isinstance(value, str):
  10. m = _ARRAY_COMBINE_RE.match(value)
  11. if m:
  12. content = (m.group(1) or "").strip()
  13. if not content:
  14. return []
  15. elements = content.split(",")
  16. result = []
  17. for elem in elements:
  18. elem = elem.strip()
  19. if elem:
  20. resolved = self.resolve(elem, context)
  21. if resolved is not None:
  22. result.append(resolved)
  23. return result
  24. if value.startswith("$"):
  25. path = value[1:]
  26. return context.lookup(path)
  27. return value
  28. if isinstance(value, dict):
  29. return {
  30. str(k): self.resolve(v, context) for k, v in value.items()
  31. }
  32. if isinstance(value, list):
  33. return [self.resolve(v, context) for v in value]
  34. return value