factory.py 2.1 KB

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