1- """Architecture adapter interfaces."""
1+ """Architecture adapter interfaces and registry helpers ."""
22from __future__ import annotations
33
44from dataclasses import dataclass
5- from typing import TYPE_CHECKING , Protocol , Tuple
5+ from importlib import import_module
6+ from typing import TYPE_CHECKING , Dict , Mapping , Protocol , Tuple
67
78if TYPE_CHECKING : # pragma: no cover - import only used for typing
89 from ..ghidra .client import GhidraClient
@@ -27,3 +28,35 @@ def probe_function(
2728class ProbeResult :
2829 mode : str | None
2930 target : int | None
31+
32+
33+ # Optional adapters are registered via module paths to keep imports lazy.
34+ _OPTIONAL_ADAPTERS : Dict [str , str ] = {
35+ "x86" : "bridge.adapters.x86:X86Adapter" ,
36+ "i386" : "bridge.adapters.x86:X86Adapter" ,
37+ }
38+
39+
40+ def optional_adapter_names () -> Mapping [str , str ]:
41+ """Return a mapping of optional adapter names to their import paths."""
42+
43+ return dict (_OPTIONAL_ADAPTERS )
44+
45+
46+ def load_optional_adapter (name : str ) -> ArchAdapter :
47+ """Instantiate an optional adapter by name without eager imports."""
48+
49+ key = name .lower ()
50+ module_spec = _OPTIONAL_ADAPTERS [key ]
51+ module_name , attr = module_spec .split (":" , 1 )
52+ module = import_module (module_name )
53+ adapter_cls = getattr (module , attr )
54+ return adapter_cls ()
55+
56+
57+ __all__ = [
58+ "ArchAdapter" ,
59+ "ProbeResult" ,
60+ "load_optional_adapter" ,
61+ "optional_adapter_names" ,
62+ ]
0 commit comments