30 lines
844 B
Python
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()
|