resolveOutputs method

Future<Map<String, dynamic>> resolveOutputs({
  1. required String nodeId,
  2. required Map<String, RuleNode> nodes,
  3. required Map<String, dynamic> context,
  4. String? outputName,
})

Implementation

Future<Map<String, dynamic>> resolveOutputs({
  required String nodeId,
  required Map<String, RuleNode> nodes,
  required Map<String, dynamic> context,
  String? outputName,
}) async {
  final node = nodes[nodeId];
  if (node == null) {
    return {};
  }

  // Get the output connections
  final connections = _castToStringMap(node.data['connections']) ?? {};
  final outputs = _castToStringMap(connections['outputs']) ?? {};

  if (outputs.isEmpty) {
    return {};
  }

  final targetOutput = outputName ?? outputs.keys.first;

  if (!outputs.containsKey(targetOutput)) {
    return {};
  }

  final connectionsList = outputs[targetOutput] as List<dynamic>? ?? [];
  final results = <String, dynamic>{};

  // Process each connected node
  for (final connection in connectionsList) {
    final connectionMap = connection as Map<String, dynamic>;
    final targetNodeId = connectionMap['nodeId'] as String;
    final targetPortName = connectionMap['portName'] as String;

    try {
      final result = await callNode(
        nodeId: targetNodeId,
        nodes: nodes,
        context: context,
      );
      results[targetPortName] = result;
    } catch (e) {
      // Continue processing other connections even if one fails
      results[targetPortName] = {'error': e.toString()};
    }
  }

  return results;
}