permissionDisplayContextForRequest function

PermissionDisplayContext permissionDisplayContextForRequest(
  1. ChatPermissionRequest request, {
  2. PermissionDisplayContextLimits? limits,
  3. Object? decodeRawJsonForTesting(
    1. 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);
}