from typing import List
from typing import Type
from pymavryk.context.abstract import AbstractContext
from pymavryk.michelson.micheline import Micheline
from pymavryk.michelson.micheline import MichelsonRuntimeError
from pymavryk.michelson.types import *
[docs]
class StorageSection(Micheline, prim='storage', args_len=1):
    args: List[Type[MichelsonType]]  # type: ignore
    def __init__(self, item: MichelsonType):
        super().__init__()
        self.item = item
    def __repr__(self):
        return repr(self.item)
[docs]
    @staticmethod
    def match(type_expr) -> Type['StorageSection']:
        try:
            cls = Micheline.match(type_expr)
            if not issubclass(cls, StorageSection):
                cls = StorageSection.create_type(args=[cls])
            assert cls.args[0].field_name is None, f'argument type cannot be annotated: %{cls.args[0].field_name}'  # type: ignore
        except Exception as e:
            raise MichelsonRuntimeError('storage', *e.args) from e
        return cls  # type: ignore 
[docs]
    @classmethod
    def execute(cls, stack, stdout: List[str], context: AbstractContext):
        context.set_storage_expr(cls.as_micheline_expr())
        stdout.append('storage: updated') 
[docs]
    @classmethod
    def generate_pydoc(cls) -> str:
        definitions = []  # type: ignore
        res = cls.args[0].generate_pydoc(definitions, cls.prim)
        if res != f'${cls.prim}':
            definitions.insert(0, (cls.prim, res))
        return '\n'.join(f'${var}:\n\t{doc}\n' for var, doc in definitions) 
[docs]
    @classmethod
    def dummy(cls, context: AbstractContext):
        return cls(cls.args[0].dummy(context)) 
[docs]
    @classmethod
    def from_micheline_value(cls, val_expr) -> 'StorageSection':
        item = cls.args[0].from_micheline_value(val_expr)
        return cls(item) 
[docs]
    @classmethod
    def from_python_object(cls, py_obj) -> 'StorageSection':
        item = cls.args[0].from_python_object(py_obj)
        return cls(item) 
[docs]
    def to_micheline_value(self, mode='readable', lazy_diff=False):
        return self.item.to_micheline_value(mode=mode, lazy_diff=lazy_diff) 
[docs]
    def to_python_object(self, try_unpack=False, lazy_diff=False):
        return self.item.to_python_object(
            try_unpack=try_unpack,
            lazy_diff=lazy_diff,
        ) 
[docs]
    def attach_context(self, context: AbstractContext):
        self.item.attach_context(context) 
[docs]
    def merge_lazy_diff(self, lazy_diff: List[dict]) -> 'StorageSection':
        item = self.item.merge_lazy_diff(lazy_diff)
        return type(self)(item) 
[docs]
    def aggregate_lazy_diff(self, mode='readable') -> List[dict]:
        lazy_diff = []  # type: ignore
        self.item.aggregate_lazy_diff(lazy_diff, mode=mode)
        return lazy_diff