from __future__ import annotations from collections.abc import Callable from app.core.interface import EngineBackend from app.models import EngineKind BackendFactory = Callable[[], EngineBackend] class BackendRegistry: def __init__(self) -> None: self._factories: dict[EngineKind, BackendFactory] = {} def register(self, kind: EngineKind, factory: BackendFactory) -> None: if kind in self._factories: raise ValueError(f"backend already registered: {kind}") self._factories[kind] = factory def create(self, kind: EngineKind) -> EngineBackend: try: return self._factories[kind]() except KeyError as exc: raise KeyError(f"backend is not registered: {kind}") from exc def kinds(self) -> tuple[EngineKind, ...]: return tuple(self._factories)