factory.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. from collections.abc import Mapping
  2. from typing import Any
  3. from core.file.file_obj import FileVar
  4. from .segments import Segment, StringSegment
  5. from .types import SegmentType
  6. from .variables import (
  7. ArrayVariable,
  8. FileVariable,
  9. FloatVariable,
  10. IntegerVariable,
  11. ObjectVariable,
  12. SecretVariable,
  13. StringVariable,
  14. Variable,
  15. )
  16. def build_variable_from_mapping(m: Mapping[str, Any], /) -> Variable:
  17. if (value_type := m.get('value_type')) is None:
  18. raise ValueError('missing value type')
  19. if not m.get('name'):
  20. raise ValueError('missing name')
  21. if (value := m.get('value')) is None:
  22. raise ValueError('missing value')
  23. match value_type:
  24. case SegmentType.STRING:
  25. return StringVariable.model_validate(m)
  26. case SegmentType.NUMBER if isinstance(value, int):
  27. return IntegerVariable.model_validate(m)
  28. case SegmentType.NUMBER if isinstance(value, float):
  29. return FloatVariable.model_validate(m)
  30. case SegmentType.SECRET:
  31. return SecretVariable.model_validate(m)
  32. case SegmentType.NUMBER if not isinstance(value, float | int):
  33. raise ValueError(f'invalid number value {value}')
  34. raise ValueError(f'not supported value type {value_type}')
  35. def build_anonymous_variable(value: Any, /) -> Variable:
  36. if isinstance(value, str):
  37. return StringVariable(name='anonymous', value=value)
  38. if isinstance(value, int):
  39. return IntegerVariable(name='anonymous', value=value)
  40. if isinstance(value, float):
  41. return FloatVariable(name='anonymous', value=value)
  42. if isinstance(value, dict):
  43. # TODO: Limit the depth of the object
  44. obj = {k: build_anonymous_variable(v) for k, v in value.items()}
  45. return ObjectVariable(name='anonymous', value=obj)
  46. if isinstance(value, list):
  47. # TODO: Limit the depth of the array
  48. elements = [build_anonymous_variable(v) for v in value]
  49. return ArrayVariable(name='anonymous', value=elements)
  50. if isinstance(value, FileVar):
  51. return FileVariable(name='anonymous', value=value)
  52. raise ValueError(f'not supported value {value}')
  53. def build_segment(value: Any, /) -> Segment:
  54. if isinstance(value, str):
  55. return StringSegment(value=value)
  56. raise ValueError(f'not supported value {value}')