dashboard-nanobot/backend/providers/selector.py

60 lines
2.5 KiB
Python
Raw Permalink Normal View History

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")