from __future__ import annotations from typing import Any from .formatter import format_node_failure_message class NodeErrorReportingProxy: """Wraps Blender operator to ensure any operator.report({'ERROR'}, ...) calls always report which node failed and the names of its inputs.""" def __init__(self, operator: Any, node: Any): self._operator = operator self._node = node def report(self, type_set: set[str], message: str) -> None: if self._operator and hasattr(self._operator, "report"): if "ERROR" in type_set: formatted_msg = format_node_failure_message(self._node, message) print(f"[NodeSlicer ERROR] {formatted_msg}") self._operator.report(type_set, formatted_msg) else: self._operator.report(type_set, message) def __getattr__(self, name: str) -> Any: return getattr(self._operator, name) def wrap_operator_for_node(operator: Any, node: Any) -> NodeErrorReportingProxy | Any: """Wraps an operator with NodeErrorReportingProxy if operator is not None.""" if operator is None: return None return NodeErrorReportingProxy(operator, node)