41 lines
1.3 KiB
Python
41 lines
1.3 KiB
Python
from msgpack import unpackb
|
|
|
|
from .types import KastenChecksum
|
|
from .types import KastenPacked
|
|
from .generator import pack
|
|
|
|
|
|
class Kasten:
|
|
def __init__(self, id: KastenChecksum,
|
|
packed_bytes: KastenPacked,
|
|
generator: 'KastenBaseGenerator',
|
|
auto_check_generator = True): # noqa
|
|
if auto_check_generator:
|
|
generator.validate_id(id, packed_bytes)
|
|
self.id = id
|
|
self.generator = generator
|
|
header, data = packed_bytes.split(b'\n', 1)
|
|
header = unpackb(header, strict_map_key=True)
|
|
self.header = header
|
|
self.data = data
|
|
|
|
def check_generator(self, generator=None):
|
|
packed = self.get_packed()
|
|
if generator is None:
|
|
self.generator.validate_id(self.id, self.packed_bytes)
|
|
else:
|
|
generator(self.id, self.packed_bytes)
|
|
|
|
# Getters are gross, but they are used here to preserve space
|
|
|
|
def get_packed(self) -> KastenPacked:
|
|
return pack.pack(self.data, self.get_data_type(),
|
|
self.get_encryption_mode(),
|
|
timestamp=self.get_timestamp())
|
|
|
|
def get_data_type(self) -> str: return self.header[0]
|
|
|
|
def get_encryption_mode(self): return self.header[1]
|
|
|
|
def get_timestamp(self): return self.header[2]
|