# Copyright (c) PARRRATE T&V 2021. All rights reserved. from abc import ABC from typing import TypeVar, Callable from bu4.parsing.extensions.extension import Extension from bu4.parsing.states.parsingread import ParsingRead from bu4.parsing.targets.apendswith import APEndsWith from bu4.transform.states.aftertransform import AfterTransform from bu4.transform.states.transformfinished import TransformFinished from bu4.transform.states.transformstate import TransformState from bu4.transform.targets.atlambda import ATLambda __all__ = ('CodeExtension',) T = TypeVar('T') class CodeExtension(Extension[T], ABC): def __init_subclass__(cls, /, code: int = None): super().__init_subclass__() if code is None: raise TypeError cls.code = code def readlambda(self, lambda_: Callable[[T], TransformState[T]]) -> TransformState[T]: return AfterTransform( ParsingRead(self.parser), ATLambda(lambda_) ) def readlambdafinished(self, lambda_: Callable[[T], T]) -> TransformState[T]: return AfterTransform( ParsingRead(self.parser), ATLambda(lambda parsed: TransformFinished(lambda_(parsed))) ) def endswith(self, expected: int, message: str): return AfterTransform(ParsingRead(self.parser), APEndsWith(self.parser, expected, message))