from __future__ import annotations from typing import Dict, Optional from .contracts import ContractDefinition class GraphOfContracts: """Lightweight registry graph mapping adapters to contract versions. This is intentionally minimal: it stores per-adapter contracts organized by contract name -> version -> ContractDefinition, enabling plug-and-play across domain adapters while keeping a canonical reference per adapter. """ def __init__(self) -> None: # adapter_name -> contract_name -> version -> ContractDefinition self._graph: Dict[str, Dict[str, Dict[str, ContractDefinition]]] = {} def register(self, adapter: str, contract_name: str, version: str, schema: Dict[str, object]) -> None: self._graph.setdefault(adapter, {}) self._graph[adapter].setdefault(contract_name, {})[version] = ContractDefinition( name=contract_name, version=version, schema=schema, ) def get_contract(self, adapter: str, contract_name: str, version: str) -> Optional[ContractDefinition]: return self._graph.get(adapter, {}).get(contract_name, {}).get(version) def list_adapter_contracts(self, adapter: str) -> Dict[str, Dict[str, ContractDefinition]]: return self._graph.get(adapter, {})