33 lines
1.1 KiB
Python
33 lines
1.1 KiB
Python
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
|