diff --git a/src/python/jw/pkg/lib/ProcFilter.py b/src/python/jw/pkg/lib/ProcFilter.py new file mode 100644 index 00000000..63959955 --- /dev/null +++ b/src/python/jw/pkg/lib/ProcFilter.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- + +from __future__ import annotations +from typing import TYPE_CHECKING + +import abc + +from .base import Result + +if TYPE_CHECKING: + from typing import Iterable + +class ProcFilter(abc.ABC): + + @abc.abstractmethod + async def _run(self, data: bytes) -> Result: + raise NotImplementedError() + + async def run(self, data: bytes) -> Result: + return await self._run(data) + +class ProcFilterIdentity(ProcFilter): + + async def _run(self, data: bytes) -> Result: + return Result(data, None, 0) + +class ProcPipeline: + + def __init__(self, f: Iterable[ProcFilter]|ProcFilter = []) -> None: + self.__filters: list[ProcFilter] = [] + self.append(f) + + def append(self, f: ProcFilter|Iterable[ProcFilter]) -> None: + if not isinstance(f, ProcFilter): + for e in f: + self.append(e) + return + self.__filters.append(f) + + async def run(self, data: bytes|Result) -> Result: + ret = data if isinstance(data, Result) else Result(data, None, 0) + for f in self.__filters: + ret = await f.run(ret.stdout) + return ret