message_decoder.py 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. from .message_coder import message_coder
  2. from .field_decoder import field_decoder
  3. from .message import message
  4. from .cutter import cutter
  5. class message_decoder(message_coder):
  6. def __init__(self, content: bytes) -> None:
  7. self.__content = content
  8. def extract_type(self) -> int:
  9. return int.from_bytes(self.__content[:self.type_size()])
  10. def __check_crc(self, target: bytes, crc: bytes) -> bool:
  11. return self._get_hash(target) == crc
  12. def build(self, target: type) -> message:
  13. if not issubclass(target, message):
  14. raise RuntimeError("Target must be subclass of message.")
  15. result = target()
  16. self.fill(result)
  17. return result
  18. def fill(self, target: message) -> object:
  19. if self.extract_type() != target.get_type():
  20. raise TypeError("Received message ID is not correct.")
  21. handler = cutter(self.__content)
  22. if target.encoder().size != handler.size:
  23. raise ValueError("Received content lenght is not correct")
  24. crc = handler.cut(self.hash_size())
  25. if not self.__check_crc(handler.content, crc):
  26. raise ConnectionError("Message CRC checksum is not correct.")
  27. handler.trim(self.type_size())
  28. for count in target.fields:
  29. field_bytes = handler.trim(count.size)
  30. count.decoder().load(field_bytes)
  31. return self