permissionDisplayContextForRequest function
PermissionDisplayContext
permissionDisplayContextForRequest(
- ChatPermissionRequest request, {
- PermissionDisplayContextLimits? limits,
- Object? decodeRawJsonForTesting(
- String source
Implementation
PermissionDisplayContext permissionDisplayContextForRequest(
ChatPermissionRequest request, {
PermissionDisplayContextLimits? limits,
Object? Function(String source)? decodeRawJsonForTesting,
}) {
final effectiveLimits = limits ?? _defaultPermissionDisplayContextLimits;
final projection = _PermissionDisplayProjectionBuilder(
effectiveLimits,
decodeRawJsonForTesting ?? jsonDecode,
).build(request.metadata);
if (projection == null) return PermissionDisplayContext.incomplete();
if (projection.root.isEmpty) {
return PermissionDisplayContext.complete(const <PermissionDisplayEntry>[]);
}
final values = <String, List<String>>{
'cwd': <String>[],
'path': <String>[],
'target': <String>[],
};
for (final container in projection.containers) {
for (final key in values.keys) {
if (!container.containsKey(key)) continue;
final value = container[key];
if (value is! String || value.trim().isEmpty) {
return PermissionDisplayContext.incomplete();
}
if (!values[key]!.contains(value)) values[key]!.add(value);
}
}
if (values.values.any((candidates) => candidates.length > 1)) {
return PermissionDisplayContext.incomplete();
}
final encoder = _PermissionDisplayEncoder(effectiveLimits.maxUtf8Bytes);
final entries = <PermissionDisplayEntry>[];
if (_containersHavePermissionCommandEvidence(projection.containers)) {
final invocation = _commandFromPermissionDisplayContainers(
request,
projection.containers,
);
if (invocation == null || invocation.ambiguous) {
return PermissionDisplayContext.incomplete();
}
final value = encoder.encodeCommand(<String>[
invocation.command,
...invocation.args,
]);
if (value == null) return PermissionDisplayContext.incomplete();
entries.add(PermissionDisplayEntry(label: 'Command', value: value));
}
for (final field in const <({String key, String label})>[
(key: 'cwd', label: 'Working directory'),
(key: 'path', label: 'Path'),
(key: 'target', label: 'Target'),
]) {
final candidates = values[field.key]!;
if (candidates.isNotEmpty) {
final value = encoder.encodeField(candidates.single);
if (value == null) return PermissionDisplayContext.incomplete();
entries.add(PermissionDisplayEntry(label: field.label, value: value));
}
}
final additionalDetails = <String, Object?>{};
for (final key in _permissionDisplayAdditionalKeys) {
final candidates = <Object?>[];
for (final container in projection.containers) {
if (!container.containsKey(key)) continue;
final value = container[key];
if (!candidates.any(
(candidate) => _samePermissionDetail(candidate, value),
)) {
candidates.add(value);
}
}
if (candidates.length > 1) return PermissionDisplayContext.incomplete();
if (candidates.isNotEmpty) additionalDetails[key] = candidates.single;
}
if (additionalDetails.isNotEmpty) {
final value = encoder.encodeDetails(additionalDetails);
if (value == null) return PermissionDisplayContext.incomplete();
entries.add(
PermissionDisplayEntry(label: 'Additional details', value: value),
);
}
return PermissionDisplayContext.complete(entries);
}