from collections.abc import Iterable from core.base import BaseRenderer class RendererRegistry: def __init__(self, renderers: Iterable[BaseRenderer] | None = None) -> None: self._renderers: dict[str, BaseRenderer] = {} for renderer in renderers or (): self.register(renderer) def register(self, renderer: BaseRenderer) -> None: self._register_key(renderer.content_type, renderer) for alias in renderer.aliases: self._register_key(alias, renderer) def _register_key(self, key: str, renderer: BaseRenderer) -> None: if key in self._renderers: registered = self._renderers[key] raise ValueError( f"Renderer key '{key}' is already registered by {type(registered).__name__}" ) self._renderers[key] = renderer def get(self, content_type: str) -> BaseRenderer: try: return self._renderers[content_type] except KeyError as exc: raise ValueError( f"Renderer for content type '{content_type}' is not registered" ) from exc