97 lines
2.1 KiB
Python
97 lines
2.1 KiB
Python
from __future__ import annotations
|
|
|
|
import abc
|
|
import dataclasses
|
|
|
|
from ldaptool._utils.dninfo import DNInfo
|
|
|
|
|
|
class Step(abc.ABC):
|
|
__slots__ = ()
|
|
|
|
@abc.abstractmethod
|
|
def step(self, value: str) -> str:
|
|
...
|
|
|
|
|
|
@dataclasses.dataclass(slots=True)
|
|
class MaxLength(Step):
|
|
limit: int
|
|
|
|
def step(self, value: str) -> str:
|
|
if not self.limit or len(value) <= self.limit:
|
|
return value
|
|
return value[: self.limit - 1] + "…"
|
|
|
|
|
|
@dataclasses.dataclass(slots=True)
|
|
class DNDomain(Step):
|
|
def step(self, value: str) -> str:
|
|
try:
|
|
dninfo = DNInfo(dn=value)
|
|
except Exception:
|
|
# not a valid DN -> no processing
|
|
return value
|
|
return dninfo.domain
|
|
|
|
|
|
@dataclasses.dataclass(slots=True)
|
|
class DNPath(Step):
|
|
def step(self, value: str) -> str:
|
|
try:
|
|
dninfo = DNInfo(dn=value)
|
|
except Exception:
|
|
# not a valid DN -> no processing
|
|
return value
|
|
return dninfo.path
|
|
|
|
|
|
@dataclasses.dataclass(slots=True)
|
|
class DNFullPath(Step):
|
|
def step(self, value: str) -> str:
|
|
try:
|
|
dninfo = DNInfo(dn=value)
|
|
except Exception:
|
|
# not a valid DN -> no processing
|
|
return value
|
|
return dninfo.full_path
|
|
|
|
|
|
_STEPS = {
|
|
"domain": DNDomain(),
|
|
"path": DNPath(),
|
|
"fullpath": DNFullPath(),
|
|
}
|
|
|
|
|
|
class InvalidStep(Exception):
|
|
pass
|
|
|
|
|
|
@dataclasses.dataclass(slots=True)
|
|
class PostProcess:
|
|
steps: list[Step]
|
|
|
|
def process(self, value: str) -> str:
|
|
for step in self.steps:
|
|
value = step.step(value)
|
|
return value
|
|
|
|
|
|
def parse_steps(steps: list[str]) -> PostProcess:
|
|
max_len = 0
|
|
try:
|
|
max_len = int(steps[-1])
|
|
steps.pop()
|
|
except ValueError:
|
|
pass
|
|
result = []
|
|
for step in steps:
|
|
step_i = _STEPS.get(step, None)
|
|
if step_i is None:
|
|
raise InvalidStep(f"Unknown post-processing step {step!r}")
|
|
result.append(step_i)
|
|
if max_len:
|
|
result.append(MaxLength(max_len))
|
|
return PostProcess(result)
|