Source code for edri.api.headerkit.registry

from __future__ import annotations

from collections.abc import Callable
from dataclasses import dataclass
from typing import Any

from .types import CombineMode

__all__ = ["FieldSpec", "Registry"]


Parser = Callable[[Any, bytes], Any]


[docs] @dataclass(frozen=True, slots=True) class FieldSpec: name: bytes combine: CombineMode parser: Parser | None = None allow_duplicate_identical: bool = False request: bool = True response: bool = True description: str = ""
[docs] class Registry: def __init__(self, specs: list[FieldSpec] | None = None) -> None: self._specs: dict[bytes, FieldSpec] = {} if specs: for spec in specs: self.register(spec)
[docs] def register(self, spec: FieldSpec) -> None: self._specs[spec.name.lower()] = spec
[docs] def get(self, name: bytes) -> FieldSpec | None: return self._specs.get(name.lower())
[docs] def copy(self) -> "Registry": return Registry(list(self._specs.values()))
def __contains__(self, name: bytes) -> bool: return name.lower() in self._specs def __iter__(self): return iter(self._specs.values())