sx/sx/types/data.py

30 lines
844 B
Python

from typing import Optional as O, Union as U
from ..core.base import Type, Context, PossibleDynamic as D
from ..core.io import Stream
class Data(Type[bytes]):
__slots__ = ('size',)
def __init__(self, size: U[D, O[int]] = None) -> None:
self.size = size
def parse(self, context: Context, stream: Stream) -> bytes:
size = context.get(self.size)
if size is None:
size = -1
return stream.read(size)
def dump(self, context: Context, stream: Stream, value: bytes) -> None:
stream.write(value)
def default(self, context: Context) -> bytes:
size = context.peek(self.size)
if size is None:
size = 0
return bytes(size)
def sizeof(self, context: Context, value: O[bytes]) -> O[int]:
return context.peek(self.size)
data = Data()