processMdRules method

Future<List<MemoryFileInfo>> processMdRules({
  1. required String rulesDir,
  2. required MemoryType type,
  3. required Set<String> processedPaths,
  4. required bool includeExternal,
  5. required bool conditionalRule,
  6. Set<String>? visitedDirs,
})

Processes all .md files in a .neomage/rules/ directory and its subdirectories.

Implementation

Future<List<MemoryFileInfo>> processMdRules({
  required String rulesDir,
  required MemoryType type,
  required Set<String> processedPaths,
  required bool includeExternal,
  required bool conditionalRule,
  Set<String>? visitedDirs,
}) async {
  visitedDirs ??= {};
  if (visitedDirs.contains(rulesDir)) return [];
  visitedDirs.add(rulesDir);

  final result = <MemoryFileInfo>[];

  try {
    final dir = Directory(rulesDir);
    if (!await dir.exists()) return [];

    await for (final entry in dir.list()) {
      if (entry is Directory) {
        result.addAll(
          await processMdRules(
            rulesDir: entry.path,
            type: type,
            processedPaths: processedPaths,
            includeExternal: includeExternal,
            conditionalRule: conditionalRule,
            visitedDirs: visitedDirs,
          ),
        );
      } else if (entry is File && entry.path.endsWith('.md')) {
        final files = await processMemoryFile(
          entry.path,
          type,
          processedPaths,
          includeExternal,
        );
        result.addAll(
          files.where(
            (f) => conditionalRule ? f.globs != null : f.globs == null,
          ),
        );
      }
    }
  } on FileSystemException catch (e) {
    final message = e.message.toLowerCase();
    if (!message.contains('no such file') &&
        !message.contains('permission denied') &&
        !message.contains('not a directory')) {
      rethrow;
    }
  }

  return result;
}