list method

  1. @override
Future<List<EagleSourceEntry>> list(
  1. EaglePath directory
)
override

Implementation

@override
Future<List<EagleSourceEntry>> list(EaglePath directory) async {
  try {
    final candidate = _lexical(directory);
    final type = await FileSystemEntity.type(candidate, followLinks: false);
    if (type == FileSystemEntityType.notFound) {
      throw EagleSourceException('Directory does not exist: $directory');
    }
    final resolved = await _resolvedContained(candidate, type);
    final entries = <EagleSourceEntry>[];
    await for (final entity in Directory(resolved).list(followLinks: false)) {
      final entityType = await FileSystemEntity.type(
        entity.path,
        followLinks: false,
      );
      final targetType = entityType == FileSystemEntityType.link
          ? await FileSystemEntity.type(entity.path)
          : entityType;
      await _resolvedContained(entity.path, entityType);
      if (targetType != FileSystemEntityType.file &&
          targetType != FileSystemEntityType.directory) {
        continue;
      }
      final name = p.basename(entity.path);
      final path = directory.isRoot
          ? EaglePath.parse(name)
          : directory.child(name);
      entries.add(
        EagleSourceEntry(
          name: name,
          path: path,
          kind: targetType == FileSystemEntityType.directory
              ? EagleSourceEntryKind.directory
              : EagleSourceEntryKind.file,
        ),
      );
    }
    entries.sort((left, right) => left.name.compareTo(right.name));
    return List<EagleSourceEntry>.unmodifiable(entries);
  } on EagleSourceException {
    rethrow;
  } catch (error) {
    throw EagleSourceException('Directory cannot be listed.', cause: error);
  }
}