from __future__ import annotations import os from importlib import import_module from typing import Any, Callable, Dict, Sequence CmdletFn = Callable[[Any, Sequence[str], Dict[str, Any]], int] def _register_cmdlet_object(cmdlet_obj, registry: Dict[str, CmdletFn]) -> None: run_fn = getattr(cmdlet_obj, "exec", None) if hasattr(cmdlet_obj, "exec") else None if not callable(run_fn): return if hasattr(cmdlet_obj, "name") and cmdlet_obj.name: registry[cmdlet_obj.name.replace("_", "-").lower()] = run_fn # Cmdlet uses 'alias' (List[str]). Some older objects may use 'aliases'. aliases = [] if hasattr(cmdlet_obj, "alias") and getattr(cmdlet_obj, "alias"): aliases.extend(getattr(cmdlet_obj, "alias") or []) if hasattr(cmdlet_obj, "aliases") and getattr(cmdlet_obj, "aliases"): aliases.extend(getattr(cmdlet_obj, "aliases") or []) for alias in aliases: if not alias: continue registry[alias.replace("_", "-").lower()] = run_fn def register_native_commands(registry: Dict[str, CmdletFn]) -> None: """Import native command modules and register their CMDLET exec functions.""" base_dir = os.path.dirname(__file__) for filename in os.listdir(base_dir): if not ( filename.endswith(".py") and not filename.startswith("_") and filename != "__init__.py" ): continue mod_name = filename[:-3] try: module = import_module(f".{mod_name}", __name__) cmdlet_obj = getattr(module, "CMDLET", None) if cmdlet_obj: _register_cmdlet_object(cmdlet_obj, registry) except Exception as exc: import sys print(f"Error importing native command '{mod_name}': {exc}", file=sys.stderr) continue