dashboard-nanobot/backend/providers/selector.py

60 lines
2.5 KiB
Python

from typing import Any
from models.bot import BotInstance
from providers.registry import ProviderRegistry
from providers.provision.base import ProvisionProvider
from providers.runtime.base import RuntimeProvider
from providers.target import resolve_provider_target
from providers.workspace.base import WorkspaceProvider
def _require_provider(value: Any, label: str):
if value is None:
raise RuntimeError(f"{label} is not configured")
return value
def _get_registry(app_state: Any) -> ProviderRegistry | None:
registry = getattr(app_state, "provider_registry", None)
if registry is None:
return None
if not isinstance(registry, ProviderRegistry):
raise RuntimeError("provider registry is misconfigured")
return registry
def get_runtime_provider(app_state: Any, bot: BotInstance) -> RuntimeProvider:
registry = _get_registry(app_state)
if registry is not None:
target = resolve_provider_target(app_state, bot)
bundle_key = registry.resolve_bundle_key(target)
provider = registry.runtime.get(bundle_key) if bundle_key else None
if provider is not None:
return provider
raise RuntimeError(f"runtime provider is not configured for target {target.key}")
return _require_provider(getattr(app_state, "runtime_provider", None), "runtime provider")
def get_workspace_provider(app_state: Any, bot: BotInstance) -> WorkspaceProvider:
registry = _get_registry(app_state)
if registry is not None:
target = resolve_provider_target(app_state, bot)
bundle_key = registry.resolve_bundle_key(target)
provider = registry.workspace.get(bundle_key) if bundle_key else None
if provider is not None:
return provider
raise RuntimeError(f"workspace provider is not configured for target {target.key}")
return _require_provider(getattr(app_state, "workspace_provider", None), "workspace provider")
def get_provision_provider(app_state: Any, bot: BotInstance) -> ProvisionProvider:
registry = _get_registry(app_state)
if registry is not None:
target = resolve_provider_target(app_state, bot)
bundle_key = registry.resolve_bundle_key(target)
provider = registry.provision.get(bundle_key) if bundle_key else None
if provider is not None:
return provider
raise RuntimeError(f"provision provider is not configured for target {target.key}")
return _require_provider(getattr(app_state, "provision_provider", None), "provision provider")