collapseHookSummaries static method

List<RenderableMessage> collapseHookSummaries(
  1. List<RenderableMessage> messages
)

Collapses consecutive hook summary messages with the same hookLabel into a single summary.

Implementation

static List<RenderableMessage> collapseHookSummaries(
  List<RenderableMessage> messages,
) {
  final result = <RenderableMessage>[];
  var i = 0;

  while (i < messages.length) {
    final msg = messages[i];
    if (_isLabeledHookSummary(msg)) {
      final label = msg.hookLabel;
      final group = <RenderableMessage>[];
      while (i < messages.length) {
        final next = messages[i];
        if (!_isLabeledHookSummary(next) || next.hookLabel != label) break;
        group.add(next);
        i++;
      }
      if (group.length == 1) {
        result.add(msg);
      } else {
        result.add(
          RenderableMessage(
            type: msg.type,
            uuid: msg.uuid,
            timestamp: msg.timestamp,
            subtype: msg.subtype,
            hookLabel: msg.hookLabel,
            hookCount: group.fold<int>(0, (s, m) => s + m.hookCount),
            hookInfos: group.expand((m) => m.hookInfos).toList(),
            hookErrors: group.expand((m) => m.hookErrors).toList(),
            preventedContinuation: group.any((m) => m.preventedContinuation),
            hasOutput: group.any((m) => m.hasOutput),
            totalDurationMs: group
                .map((m) => m.totalDurationMs ?? 0)
                .reduce((a, b) => max(a, b)),
          ),
        );
      }
    } else {
      result.add(msg);
      i++;
    }
  }

  return result;
}