+ return (node, socket, socket_index, input, output)
+
+def _resolve_node(tree: NodeTree, node: NodeType) \
+ -> Dict[str, Union[Node, List[NodeSocket], List[NodeLink]]]:
+ """
+ In the context of ``tree``, get the Node and input and/or output sockets
+ of the `node`.
+
+ Return:
+ Tuple containing (Node, ``Socket``s, output ``Socket``s)
+ """
+
+ inputs = []
+ outputs = []
+ input_links = []
+ output_links = []
+
+ if isinstance(node, str):
+ node_name, socket_name, socket_index, include_inputs, include_outputs = \
+ _parse_node_str(node)
+
+ if node_name not in tree.nodes:
+ _invalid_node_str(node,
+ "Node name ({}) not found".format(node_name))
+
+ node = tree.nodes[node_name]
+ _append_matching_sockets(socket_name, socket_index, include_inputs, node.inputs, inputs, input_links)
+ _append_matching_sockets(socket_name, socket_index, include_outputs, node.outputs, outputs, output_links)
+ elif isinstance(node, Node):
+ outputs.extend(node.outputs)
+ inputs.extend(node.inputs)
+ input_links.extend(filter(lambda a: a.to_node == node, node.links))
+ output_links.extend(filter(lambda a: a.from_node == node, node.links))
+ elif isinstance(node, NodeSocket):
+ if node.is_output:
+ outputs.append(node)
+ output_links.extend(node.links)
+ else:
+ inputs.append(node)
+ input_links.extend(node.links)
+ node = node.node
+
+ return {
+ "node": node,
+ "input_links": input_links,
+ "input_sockets": inputs,
+ "output_links": output_links,
+ "output_sockets": outputs,
+ }