infrasynth-backend-kit/infrasynth/notifications/resolvers.py
2026-08-28 14:38:47 -05:00

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)