builder_template.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  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. self.set_key("typename", target.typename)
  21. def __create_setter_name(self, key: str, section: str | None) -> str:
  22. if section is None:
  23. return "kn_" + key
  24. return "ks_" + key + section
  25. def _set_required_key(
  26. self,
  27. key: str,
  28. target: str,
  29. section: str | None
  30. ) -> object:
  31. name = self.__create_setter_name(key, section)
  32. if not name in self.__required:
  33. raise RuntimeError("Key " + key + " had been already set.")
  34. self.__required.remove(name)
  35. return self.set_key(key, target, section)
  36. def _create_setter(self, key: str, section: str | None = None) -> object:
  37. self.__required.add(self.__create_setter_name(key, section))
  38. return lambda target: self._set_required_key(key, target, section)
  39. def build(self) -> message:
  40. if len(self.__required) > 0:
  41. raise RuntimeError("One or more required keys are not set.")
  42. return super().build(help_type = self.__result_type)