projectionSnapshotChatMessageMetadata function
({ChatInputLimitExceeded? limit, Map<String, Object?> ? metadata})
projectionSnapshotChatMessageMetadata(
- Map<
String, Object?> raw, - 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,
);
}