import types class message: def __init__(self, default: dict, sections: dict) -> None: sections_proxy = dict() for key, value in sections.items(): sections_proxy[key] = types.MappingProxyType(value) self.__sections = types.MappingProxyType(sections_proxy) self.__default = types.MappingProxyType(default) def get_key(self, key: str, section: str | None = None) -> str: if section is None: return self.get_from_default(key) return self.get_from_section(section, key) def get_from_default(self, key: str) -> any: return self.__default[key] def get_from_section(self, section: str, key: str) -> any: return self.__sections[section][key] @property def default(self) -> types.MappingProxyType: return self.__default @property def sections(self) -> types.MappingProxyType: return self.__sections class message_builder: def __init__(self) -> None: self.__sections = dict() self.__default = dict() def __add_section(self, section: str) -> object: if not section in self.__sections.keys(): self.__sections[section] = dict() def __set_section_key(self, section: str, key: str, value: str) -> None: self.__sections[section][key] = value def __set_default_key(self, key: str, value: str) -> None: self.__default[key] = value def set_key( self, key: str, value: str, section: str | None = None ) -> object: key = key.strip() value = value.strip() if len(key) == 0: raise RuntimeError("Key nam can nob being empty.") if section is None: self.__set_default_key(key, value) return self section = section.strip() if len(section) == 0: raise RuntimeError("Section name can not being empty.") self.__add_section(section) self.__set_section_key(section, key, value) return self def build(self) -> message: return message(self.__default, self.__sections)