projectionSnapshotChatMessageMetadata function

({ChatInputLimitExceeded? limit, Map<String, Object?>? metadata}) projectionSnapshotChatMessageMetadata(
  1. Map<String, Object?> raw,
  2. ChatInputBudget budget
)

Implementation

({Map<String, Object?>? metadata, acp.ChatInputLimitExceeded? limit})
projectionSnapshotChatMessageMetadata(
  Map<String, Object?> raw,
  acp.ChatInputBudget budget,
) {
  final int reportedLength;
  try {
    reportedLength = raw.length;
  } on Object {
    return (metadata: null, limit: null);
  }
  if (reportedLength < 0) return (metadata: null, limit: null);
  final entryLimit = budget.maxCollectionItems < budget.maxMetadataEntries
      ? budget.maxCollectionItems
      : budget.maxMetadataEntries;
  final hasLimit = reportedLength > entryLimit;
  final snapshotLength = hasLimit ? entryLimit + 1 : reportedLength;
  final Iterator<MapEntry<String, Object?>> iterator;
  try {
    iterator = raw.entries.iterator;
  } on Object {
    return (metadata: null, limit: null);
  }
  final snapshot = <String, Object?>{};
  for (var index = 0; index < snapshotLength; index += 1) {
    final bool hasNext;
    try {
      hasNext = iterator.moveNext();
    } on Object {
      return (metadata: null, limit: null);
    }
    if (!hasNext) return (metadata: null, limit: null);
    final MapEntry<String, Object?> entry;
    try {
      entry = iterator.current;
    } on Object {
      return (metadata: null, limit: null);
    }
    if (snapshot.containsKey(entry.key)) {
      return (metadata: null, limit: null);
    }
    snapshot[entry.key] = entry.value;
  }
  if (!hasLimit) {
    final bool hasUnexpectedEntry;
    try {
      hasUnexpectedEntry = iterator.moveNext();
    } on Object {
      return (metadata: null, limit: null);
    }
    if (hasUnexpectedEntry) return (metadata: null, limit: null);
  }
  return (
    metadata: Map<String, Object?>.unmodifiable(snapshot),
    limit: hasLimit
        ? acp.ChatInputLimitExceeded(
            resource: 'chat message metadata entries',
            limit: entryLimit,
            observedAtLeast: reportedLength,
          )
        : null,
  );
}