|
@@ 72-95 (lines=24) @@
|
| 69 |
|
# recreate the struct with the new format |
| 70 |
|
self._struct = struct.Struct(self.format) |
| 71 |
|
|
| 72 |
|
def pack(self, msg): |
| 73 |
|
"""Pack the provided values into the supplied buffer.""" |
| 74 |
|
# The value to pack could be a raw value, an enum value, or a string |
| 75 |
|
# that represents the enum value, first ensure that the value provided |
| 76 |
|
# is a valid value for the referenced enum class. |
| 77 |
|
item = msg[self.name] |
| 78 |
|
if isinstance(item, self.ref): |
| 79 |
|
enum_item = item |
| 80 |
|
elif isinstance(item, str): |
| 81 |
|
try: |
| 82 |
|
enum_item = getattr(self.ref, msg[self.name]) |
| 83 |
|
except AttributeError: |
| 84 |
|
enum_name = re.match(r"<enum '(\S+)'>", str(self.ref)).group(1) |
| 85 |
|
msg = '{} is not a valid {}'.format(msg[self.name], enum_name) |
| 86 |
|
raise ValueError(msg) |
| 87 |
|
else: |
| 88 |
|
enum_item = self.ref(item) |
| 89 |
|
data = self._struct.pack(enum_item.value) |
| 90 |
|
|
| 91 |
|
# If the data does not meet the alignment, add some padding |
| 92 |
|
missing_bytes = len(data) % self._alignment |
| 93 |
|
if missing_bytes: |
| 94 |
|
data += b'\x00' * missing_bytes |
| 95 |
|
return data |
| 96 |
|
|
| 97 |
|
def unpack(self, msg, buf): |
| 98 |
|
"""Unpack data from the supplied buffer using the initialized format.""" |
|
@@ 117-132 (lines=16) @@
|
| 114 |
|
|
| 115 |
|
return (member, unused) |
| 116 |
|
|
| 117 |
|
def make(self, msg): |
| 118 |
|
"""Return the "transformed" value for this element""" |
| 119 |
|
# Handle the same conditions that pack handles |
| 120 |
|
item = msg[self.name] |
| 121 |
|
if isinstance(item, self.ref): |
| 122 |
|
enum_item = item |
| 123 |
|
elif isinstance(item, str): |
| 124 |
|
try: |
| 125 |
|
enum_item = getattr(self.ref, msg[self.name]) |
| 126 |
|
except AttributeError: |
| 127 |
|
enum_name = re.match(r"<enum '(\S+)'>", str(self.ref)).group(1) |
| 128 |
|
msg = '{} is not a valid {}'.format(msg[self.name], enum_name) |
| 129 |
|
raise ValueError(msg) |
| 130 |
|
else: |
| 131 |
|
enum_item = self.ref(item) |
| 132 |
|
return enum_item |
| 133 |
|
|