from .template import template from .message import message from .message_builder import message_builder class builder_template(message_builder): def __init__(self, result_type: type) -> None: super().__init__() self.__required = set() self.__result_type = result_type def _import_template(self, target: template) -> None: default_keys = target.default_keys for key in default_keys: name = "set_" + key setattr(self, name, self._create_setter(key)) for section in target.sections_names: for key in target.get_section_keys(section): name = "set_" + key if name in default_keys: name = "set_" + key + "_" + section setattr(self, name, self._create_setter(key, section)) self.set_key("typename", target.typename) def __create_setter_name(self, key: str, section: str | None) -> str: if section is None: return "kn_" + key return "ks_" + key + section def _set_required_key( self, key: str, target: str, section: str | None ) -> object: name = self.__create_setter_name(key, section) if not name in self.__required: raise RuntimeError("Key " + key + " had been already set.") self.__required.remove(name) return self.set_key(key, target, section) def _create_setter(self, key: str, section: str | None = None) -> object: self.__required.add(self.__create_setter_name(key, section)) return lambda target: self._set_required_key(key, target, section) def build(self) -> message: if len(self.__required) > 0: raise RuntimeError("One or more required keys are not set.") return super().build(help_type = self.__result_type)