From 411bfd41cac6a7c959ad2cc751f24312c54fae0a Mon Sep 17 00:00:00 2001 From: Jan Lindemann Date: Wed, 22 Apr 2026 16:52:09 +0200 Subject: [PATCH] lib.ProcFilter: Add module Add the ProcFilter module, containing the following classes: - ProcFilter: Abstract base class defining a run(data: bytes) -> Result method, allowing to do arbitrary data manipulation in subclasses. - ProcFilterIdenty A ProcFilter specialization which passes through the input unchanged. - ProcPipeline A container for multiple chained ProcFilter classes Signed-off-by: Jan Lindemann --- src/python/jw/pkg/lib/ProcFilter.py | 44 +++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/python/jw/pkg/lib/ProcFilter.py 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