import logging logger = logging.getLogger(__name__) class VariableResolverRegistry: _resolvers: dict[str, dict] = {} @classmethod def register( cls, variable_name: str, label: str | None = None, description: str | None = None, namespace: str = "__global__", ): def decorator(func): cls._resolvers[f"{namespace}:{variable_name}"] = { "fn": func, "label": label or variable_name, "description": description or "", "namespace": namespace, "variable_name": variable_name, } logger.debug(f"Variable resolver registered: {namespace}:{variable_name}") return func return decorator @classmethod def resolve( cls, variable_name: str, recipient: str, context: dict, namespace: str | None = None, request=None, ): if namespace: key = f"{namespace}:{variable_name}" entry = cls._resolvers.get(key) if entry: return entry["fn"](recipient, context, request=request) key = f"__global__:{variable_name}" entry = cls._resolvers.get(key) if entry: return entry["fn"](recipient, context, request=request) return None @classmethod def get_available_variables(cls, namespace: str | None = None): if namespace: return {k: v for k, v in cls._resolvers.items() if v["namespace"] == namespace} return dict(cls._resolvers)