60 lines
2.5 KiB
Python
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")
|