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