concat method

Merges a later streaming chunk into this block.

Implementation

AIChatMessageContentBlock concat(final AIChatMessageContentBlock other) {
  if (!canMerge(other)) {
    throw ArgumentError('Cannot merge unrelated content blocks');
  }
  return switch ((this, other)) {
    (final AIChatMessageTextBlock first, final AIChatMessageTextBlock next) =>
      AIChatMessageTextBlock(
        text: first.text + next.text,
        id: _mergedId(first, next),
        index: next.index ?? first.index,
        providerData: mergeProviderData(
          first.providerData,
          next.providerData,
        ),
      ),
    (
      final AIChatMessageReasoningBlock first,
      final AIChatMessageReasoningBlock next,
    ) =>
      AIChatMessageReasoningBlock(
        reasoning: first.reasoning + next.reasoning,
        id: _mergedId(first, next),
        index: next.index ?? first.index,
        providerData: mergeProviderData(
          first.providerData,
          next.providerData,
        ),
      ),
    (
      final AIChatMessageMediaBlock first,
      final AIChatMessageMediaBlock next,
    ) =>
      AIChatMessageMediaBlock(
        data: first.data + next.data,
        mimeType: next.mimeType ?? first.mimeType,
        id: _mergedId(first, next),
        index: next.index ?? first.index,
        providerData: mergeProviderData(
          first.providerData,
          next.providerData,
        ),
      ),
    (final AIChatMessageFileBlock first, final AIChatMessageFileBlock next) =>
      AIChatMessageFileBlock(
        uri: next.uri.isNotEmpty ? next.uri : first.uri,
        name: next.name ?? first.name,
        mimeType: next.mimeType ?? first.mimeType,
        id: _mergedId(first, next),
        index: next.index ?? first.index,
        providerData: mergeProviderData(
          first.providerData,
          next.providerData,
        ),
      ),
    (final AIChatMessageToolCall first, final AIChatMessageToolCall next) =>
      AIChatMessageToolCall(
        id: _mergedToolCallId(first, next),
        index: next.index ?? first.index,
        name: first.name + next.name,
        argumentsRaw: first.argumentsRaw + next.argumentsRaw,
        arguments: _mergeToolArguments(first, next),
        providerData: mergeProviderData(
          first.providerData,
          next.providerData,
        ),
      ),
    (
      final AIChatMessageServerToolCall first,
      final AIChatMessageServerToolCall next,
    ) =>
      AIChatMessageServerToolCall(
        id: _mergedId(first, next),
        index: next.index ?? first.index,
        name: first.name + next.name,
        argumentsRaw: first.argumentsRaw + next.argumentsRaw,
        arguments: _mergeServerToolArguments(first, next),
        providerData: mergeProviderData(
          first.providerData,
          next.providerData,
        ),
      ),
    (
      final AIChatMessageServerToolResult first,
      final AIChatMessageServerToolResult next,
    ) =>
      AIChatMessageServerToolResult(
        id: _mergedId(first, next),
        index: next.index ?? first.index,
        toolCallId: next.toolCallId.isNotEmpty
            ? next.toolCallId
            : first.toolCallId,
        name: next.name ?? first.name,
        result: _mergeValues(first.result, next.result),
        providerData: mergeProviderData(
          first.providerData,
          next.providerData,
        ),
      ),
    (
      final AIChatMessageProviderMetadataBlock first,
      final AIChatMessageProviderMetadataBlock next,
    ) =>
      AIChatMessageProviderMetadataBlock(
        id: _mergedId(first, next),
        index: next.index ?? first.index,
        providerData: mergeProviderData(
          first.providerData,
          next.providerData,
        ),
      ),
    (
      final AIChatMessageNonStandardBlock first,
      final AIChatMessageNonStandardBlock next,
    ) =>
      AIChatMessageNonStandardBlock(
        value: _mergeValues(first.value, next.value),
        id: _mergedId(first, next),
        index: next.index ?? first.index,
        providerData: mergeProviderData(
          first.providerData,
          next.providerData,
        ),
      ),
    _ => throw StateError('Unreachable content-block merge'),
  };
}