execute method

Future<AnalysisResult> execute(
  1. String projectPath
)

Executes asset analysis on the given projectPath.

Returns an AnalysisResult containing all analyzed assets, detected issues, unused assets, and any scan errors.

Throws AssetOptException if no asset directories are found.

Implementation

Future<AnalysisResult> execute(String projectPath) async {
  try {
    _state.startAnalysis();

    _state.setTask('Reading project configuration...');
    final assetPaths = await _fileService.findAssetPaths(projectPath);
    if (assetPaths.isEmpty) {
      throw AssetOptException('No asset directories found in pubspec.yaml');
    }

    _state.setTask('Scanning asset directories...');
    final scanResult = await _fileService.scanAssets(assetPaths);
    final totalFiles = scanResult.assets.length;

    _state.setTask('Analyzing assets...');
    final accumulator = await _analyzeAssetsInBatches(
      scanResult.assets,
      totalFiles,
    );

    final allErrors = {...scanResult.errors, ...accumulator.errors};

    _state.setTask('Analyzing asset usage...');
    final usedAssetPaths = await _usageService.findUsedAssetPaths(projectPath);
    final allAssetPaths = accumulator.assets.map((a) => a.info.path).toList();
    final unusedPaths = _usageService.findUnusedAssets(
      allAssetPaths,
      usedAssetPaths,
      projectPath,
    );

    final unusedAssets = accumulator.assets
        .where((a) => unusedPaths.contains(a.info.path))
        .toList();

    _state.setTask('Finalizing analysis...');
    final result = AnalysisResult(
      assets: accumulator.assets,
      scanErrors: allErrors,
      analyzedAt: DateTime.now(),
      projectRoot: projectPath,
      unusedAssets: unusedAssets,
    );

    _state.completeAnalysis(result);
    return result;
  } catch (e) {
    _state.failAnalysis(e.toString());
    rethrow;
  }
}