55 lines
1.6 KiB
Python
55 lines
1.6 KiB
Python
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)
|