builder_template.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. from .template import template
  2. from .message import message
  3. from .message_builder import message_builder
  4. class builder_template(message_builder):
  5. def __init__(self, result_type: type) -> None:
  6. super().__init__()
  7. self.__required = set()
  8. self.__result_type = result_type
  9. def _import_template(self, target: template) -> None:
  10. default_keys = target.default_keys
  11. for key in default_keys:
  12. name = "set_" + key
  13. setattr(self, name, self._create_setter(key))
  14. for section in target.sections_names:
  15. for key in target.get_section_keys(section):
  16. name = "set_" + key
  17. if name in default_keys:
  18. name = "set_" + key + "_" + section
  19. setattr(self, name, self._create_setter(key, section))
  20. def __create_setter_name(self, key: str, section: str | None) -> str:
  21. if section is None:
  22. return "kn_" + key
  23. return "ks_" + key + section
  24. def _set_required_key(
  25. self,
  26. key: str,
  27. target: str,
  28. section: str | None
  29. ) -> object:
  30. name = self.__create_setter_name(key, section)
  31. if not name in self.__required:
  32. raise RuntimeError("Key " + key + " had been already set.")
  33. self.__required.remove(name)
  34. return self.set_key(key, target, section)
  35. def _create_setter(self, key: str, section: str | None = None) -> object:
  36. self.__required.add(self.__create_setter_name(key, section))
  37. return lambda target: self._set_required_key(key, target, section)
  38. def build(self) -> message:
  39. if len(self.__required) > 0:
  40. raise RuntimeError("One or more required keys are not set.")
  41. return super().build(help_type = self.__result_type)