27 lines
845 B
Python
27 lines
845 B
Python
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)
|