binary.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. from rlp.atomic import (
  2. Atomic,
  3. )
  4. from rlp.exceptions import (
  5. DeserializationError,
  6. SerializationError,
  7. )
  8. class Binary:
  9. """
  10. A sedes object for binary data of certain length.
  11. :param min_length: the minimal length in bytes or `None` for no lower limit
  12. :param max_length: the maximal length in bytes or `None` for no upper limit
  13. :param allow_empty: if true, empty strings are considered valid even if
  14. a minimum length is required otherwise
  15. """
  16. def __init__(self, min_length=None, max_length=None, allow_empty=False):
  17. self.min_length = min_length or 0
  18. if max_length is None:
  19. self.max_length = float("inf")
  20. else:
  21. self.max_length = max_length
  22. self.allow_empty = allow_empty
  23. @classmethod
  24. def fixed_length(cls, length, allow_empty=False):
  25. """Create a sedes for binary data with exactly `length` bytes."""
  26. return cls(length, length, allow_empty=allow_empty)
  27. @classmethod
  28. def is_valid_type(cls, obj):
  29. return isinstance(obj, (bytes, bytearray))
  30. def is_valid_length(self, length):
  31. return any(
  32. (
  33. self.min_length <= length <= self.max_length,
  34. self.allow_empty and length == 0,
  35. )
  36. )
  37. def serialize(self, obj):
  38. if not Binary.is_valid_type(obj):
  39. raise SerializationError(f"Object is not a serializable ({type(obj)})", obj)
  40. if not self.is_valid_length(len(obj)):
  41. raise SerializationError("Object has invalid length", obj)
  42. return obj
  43. def deserialize(self, serial):
  44. if not isinstance(serial, Atomic):
  45. raise DeserializationError(
  46. f"Objects of type {type(serial).__name__} cannot be deserialized",
  47. serial,
  48. )
  49. if self.is_valid_length(len(serial)):
  50. return serial
  51. else:
  52. raise DeserializationError(f"{type(serial)} has invalid length", serial)
  53. binary = Binary()