selectDartFiles method
Selects the Dart requestedFiles that belong to availableFiles.
availableFiles contains every Dart file discovered under lib/.
Paths may be absolute or relative and are normalized before comparison.
Duplicates are removed while preserving the order in which they were
first requested.
Throws an InvalidFileSelectionException when a requested path does not
exist, is not a .dart file, or is outside lib/.
Implementation
List<String> selectDartFiles({
required List<String> availableFiles,
required List<String> requestedFiles,
}) {
if (requestedFiles.isEmpty) {
return availableFiles;
}
final byNormalizedPath = <String, String>{};
for (final filePath in availableFiles) {
byNormalizedPath[_normalizePath(filePath)] = filePath;
}
final problems = <String>[];
final selected = <String>[];
final seen = <String>{};
for (final requestedPath in requestedFiles) {
final normalizedPath = _normalizePath(requestedPath);
if (!seen.add(normalizedPath)) {
continue;
}
if (!requestedPath.endsWith('.dart')) {
problems.add('$requestedPath is not a Dart (.dart) file.');
continue;
}
if (!File(requestedPath).existsSync()) {
problems.add('$requestedPath does not exist.');
continue;
}
final availablePath = byNormalizedPath[normalizedPath];
if (availablePath == null) {
problems.add('$requestedPath is outside lib/.');
continue;
}
selected.add(availablePath);
}
if (problems.isNotEmpty) {
throw InvalidFileSelectionException(problems);
}
return selected;
}