encoder.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import types
  2. import functools
  3. from .message import message
  4. from .protocol import protocol
  5. from .string_builder import string_builder
  6. class encoder(protocol):
  7. def __init__(self, target: message) -> None:
  8. self.__target = target
  9. @property
  10. def _target(self) -> message:
  11. return self.__target
  12. @functools.cache
  13. def process(self) -> str:
  14. result = string_builder()
  15. result.add(self.__code_section_body(self._target.default))
  16. for section, content in self._target.sections.items():
  17. result.add(self.__code_section_header(section))
  18. result.add(self.__code_section_body(content))
  19. return result.build()
  20. def __code_section_body(self, content: dict) -> str:
  21. result = string_builder()
  22. for key, value in content.items():
  23. result.add(self.__code_key_value(key, value))
  24. return result.build()
  25. def __code_section_header(self, section: str) -> str:
  26. return string_builder() \
  27. .add(self._section_buckles[0]) \
  28. .add(section) \
  29. .add(self._section_buckles[1]) \
  30. .add(self._line_separator) \
  31. .build()
  32. def __code_key_value(self, key: str, value: str) -> str:
  33. return string_builder() \
  34. .add(key) \
  35. .add(self._setter) \
  36. .add(value) \
  37. .add(self._line_separator) \
  38. .build()
  39. def __str__(self) -> str:
  40. return self.process()
  41. def __repr(self) -> str:
  42. return "Message encoder:\n" + str(self)