builtup4/bu4/parsing/extensions/CodeExtension.py
2021-09-09 08:16:01 +03:00

40 lines
1.3 KiB
Python

# 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))