migrateAgentEntriesAtPath function

Future<MigrateAgentEntriesReport> migrateAgentEntriesAtPath({
  1. required String path,
  2. required bool write,
  3. required bool checkOnly,
  4. String defaultNamespace = 'app',
})

Implementation

Future<MigrateAgentEntriesReport> migrateAgentEntriesAtPath({
  required final String path,
  required final bool write,
  required final bool checkOnly,
  final String defaultNamespace = 'app',
}) async {
  final target = FileSystemEntity.typeSync(path);
  if (target == FileSystemEntityType.notFound) {
    throw MigrateAgentEntriesPathNotFound(path);
  }

  final migrator = MigrateAgentEntriesMigrator(
    defaultNamespace: defaultNamespace,
  );
  final dartFiles = <File>[];
  if (target == FileSystemEntityType.file) {
    if (p.extension(path) == '.dart') {
      dartFiles.add(File(path));
    }
  } else {
    await for (final entity in Directory(
      path,
    ).list(recursive: true, followLinks: false)) {
      if (entity is File && p.extension(entity.path) == '.dart') {
        dartFiles.add(entity);
      }
    }
  }

  final results = <MigrateAgentEntriesFileResult>[];
  for (final file in dartFiles) {
    final original = await file.readAsString();
    if (!original.contains('MCPCallEntry')) {
      continue;
    }
    final migrated = migrator.migrateSource(original);
    final changed = migrated != original;
    results.add(
      MigrateAgentEntriesFileResult(
        path: file.path,
        changed: changed,
        migrated: migrated,
      ),
    );
    if (changed && write && !checkOnly) {
      await file.writeAsString(migrated);
    }
  }

  return MigrateAgentEntriesReport(
    filesScanned: dartFiles.length,
    filesChanged: results.where((final r) => r.changed).length,
    results: results,
  );
}