dashboard-nanobot/backend/providers/registry.py

48 lines
1.8 KiB
Python

from dataclasses import dataclass, field
from typing import Dict, Optional
from providers.target import ProviderTarget
from providers.provision.base import ProvisionProvider
from providers.runtime.base import RuntimeProvider
from providers.workspace.base import WorkspaceProvider
@dataclass
class ProviderRegistry:
runtime: Dict[str, RuntimeProvider] = field(default_factory=dict)
workspace: Dict[str, WorkspaceProvider] = field(default_factory=dict)
provision: Dict[str, ProvisionProvider] = field(default_factory=dict)
def register_bundle(
self,
*,
key: str,
runtime_provider: RuntimeProvider,
workspace_provider: WorkspaceProvider,
provision_provider: ProvisionProvider,
) -> None:
self.runtime[key] = runtime_provider
self.workspace[key] = workspace_provider
self.provision[key] = provision_provider
def resolve_bundle_key(self, target: ProviderTarget) -> Optional[str]:
exact = target.key
if exact in self.runtime and exact in self.workspace and exact in self.provision:
return exact
for key in self.runtime.keys():
if key not in self.workspace or key not in self.provision:
continue
parts = str(key or "").split(":")
if len(parts) < 4:
continue
_, transport_kind, runtime_kind, core_adapter = parts[0], parts[1], parts[2], ":".join(parts[3:])
if (
str(transport_kind or "").strip().lower() == str(target.transport_kind or "").strip().lower()
and str(runtime_kind or "").strip().lower() == str(target.runtime_kind or "").strip().lower()
and str(core_adapter or "").strip().lower() == str(target.core_adapter or "").strip().lower()
):
return key
return None