run method

  1. @override
Future<int> run()
override

Runs this command.

The return value is wrapped in a Future if necessary and returned by CommandRunner.runCommand.

Implementation

@override
Future<int> run() async {
  final results = argResults!;
  final prefix = results['prefix'] as String;
  final verbose = results['verbose'] as bool;
  final strict = results['strict'] as bool;
  final logger = FLILogger(verbose);

  // Reject stray positional args before doing anything else.
  final rejectCode = rejectUnknownArgs(results, logger);
  if (rejectCode != null) {
    return rejectCode;
  }

  var problemDetected = false;
  var deprecationDetected = false;

  final absolutePrefix = p.normalize(p.absolute(prefix));

  // 1. Tool version.
  stdout.writeln('flutter_launcher_icons_flavors doctor');
  stdout.writeln('  version: $packageVersion');

  // 2. Resolved prefix.
  stdout.writeln('  prefix:  $absolutePrefix');
  stdout.writeln('');

  // 3. Detected sources.
  stdout.writeln('Detected configuration sources:');
  final consolidatedPath = p.join(
    prefix,
    constants.consolidatedFlavorsFileName,
  );
  final singlePath = p.join(prefix, constants.singleConfigFileName);
  final pubspecPath = p.join(prefix, constants.pubspecFilePath);
  final legacyPaths = _findLegacyFiles(prefix);

  _writeFoundLine(consolidatedPath, 'flutter_launcher_icons_flavors.yaml');
  if (legacyPaths.isEmpty) {
    stdout.writeln('  flutter_launcher_icons-<flavor>.yaml: [absent]');
  } else {
    stdout.writeln('  flutter_launcher_icons-<flavor>.yaml: [FOUND]');
    for (final lp in legacyPaths) {
      stdout.writeln('      - $lp');
    }
  }
  _writeFoundLine(singlePath, 'flutter_launcher_icons.yaml');

  final pubspecHas = _pubspecHasInline(pubspecPath);
  if (pubspecHas == _PubspecInline.absent) {
    stdout.writeln('  pubspec.yaml inline:                  [absent]');
  } else if (pubspecHas == _PubspecInline.flutterLauncherIcons) {
    stdout.writeln(
      '  pubspec.yaml inline:                  [FOUND] (flutter_launcher_icons)',
    );
  } else {
    stdout.writeln(
      '  pubspec.yaml inline:                  [FOUND] (flutter_icons — DEPRECATED)',
    );
  }
  stdout.writeln('');

  // 4 & 5. Precedence winner / ignored sources.
  ResolvedSource? resolved;
  try {
    resolved = resolveSource(prefixPath: prefix, logger: logger);
  } on NoConfigFoundException catch (e) {
    problemDetected = true;
    stdout.writeln('Precedence winner: NONE');
    stdout.writeln('  reason: $e');
    stdout.writeln('');
  }

  if (resolved != null) {
    stdout.writeln('Precedence winner: ${_kindLabel(resolved.kind)}');
    if (resolved.path != null) {
      stdout.writeln('  path: ${resolved.path}');
    }
    stdout.writeln('  reason: ${_winnerReason(resolved.kind)}');
    stdout.writeln('');
    if (resolved.ignoredLegacy.isNotEmpty) {
      stdout.writeln('Ignored due to precedence:');
      for (final ig in resolved.ignoredLegacy) {
        stdout.writeln('  - $ig');
      }
      stdout.writeln(
        '  (`generate` would emit the coexistence warning; '
        '`--strict` would escalate to exit 65.)',
      );
      stdout.writeln('');
    } else {
      stdout.writeln('Ignored due to precedence: none');
      stdout.writeln('');
    }

    // 6. Parsed flavors.
    problemDetected |= _reportFlavors(
      resolved: resolved,
      prefix: prefix,
      verbose: verbose,
      logger: logger,
    );
  }

  // 7. Android Gradle detection.
  await _reportGradle(prefix);

  // 8. Image-path existence per resolved flavor (read-only check).
  if (resolved != null) {
    _reportImagePaths(resolved: resolved, prefix: prefix, logger: logger);
  }

  // 9. Web index.html FLI marker check.
  if (resolved != null) {
    _reportWebIndexMarkers(
      resolved: resolved,
      prefix: prefix,
      logger: logger,
    );
  }

  // 10. Deprecated key usage.
  if (pubspecHas == _PubspecInline.flutterIcons) {
    deprecationDetected = true;
    stdout.writeln('Deprecated keys:');
    stdout.writeln(
      "  ⚠ Deprecated key 'flutter_icons:' in pubspec.yaml — rename to "
      "'flutter_launcher_icons:' or migrate to "
      'flutter_launcher_icons_flavors.yaml.',
    );
  } else {
    stdout.writeln('Deprecated keys: none detected');
  }

  if (problemDetected) {
    return 65;
  }
  if (strict && deprecationDetected) {
    return 65;
  }
  return 0;
}