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 verbose = results['verbose'] as bool;
  final logger = FLILogger(verbose);
  final prefix = results['prefix'] as String;
  final explicit = results['file'] as String?;
  final flavors = (results['flavor'] as List<dynamic>).cast<String>();
  final allFlavors = results['all-flavors'] as bool;
  final listFlavors = results['list-flavors'] as bool;
  final continueOnError = results['continue-on-error'] as bool;
  final strict = results['strict'] as bool;
  final autoYes = results['yes'] as bool;

  // Reject stray positional args before doing anything else: e.g.
  // `generate foobar` would otherwise silently ignore `foobar`.
  final rejectCode = rejectUnknownArgs(results, logger);
  if (rejectCode != null) {
    return rejectCode;
  }

  // README contract: --flavor and --all-flavors are mutually exclusive.
  // Conflicting flags → usage error (64).
  if (flavors.isNotEmpty && allFlavors) {
    logger.error('Could not generate launcher icons');
    logger.error(
      '--flavor and --all-flavors are mutually exclusive; pass one or the other.',
    );
    return 64;
  }

  // 1. Resolve which config source to use.
  final ResolvedSource resolved;
  try {
    resolved = resolveSource(
      prefixPath: prefix,
      explicitFilePath: explicit,
      logger: logger,
    );
  } on NoConfigFoundException catch (e) {
    logger.error('Could not generate launcher icons');
    logger.error('$e');
    return 65;
  }

  // 2. Dispatch by source kind.
  switch (resolved.kind) {
    case ConfigSourceKind.consolidatedFlavors:
      return _runConsolidated(
        resolved: resolved,
        logger: logger,
        prefix: prefix,
        requestedFlavors: flavors,
        allFlavors: allFlavors,
        listFlavors: listFlavors,
        continueOnError: continueOnError,
        strict: strict,
        autoYes: autoYes,
      );

    case ConfigSourceKind.explicitFile:
      if (resolved.isMultiFlavor) {
        return _runConsolidated(
          resolved: resolved,
          logger: logger,
          prefix: prefix,
          requestedFlavors: flavors,
          allFlavors: allFlavors,
          listFlavors: listFlavors,
          continueOnError: continueOnError,
          strict: strict,
          autoYes: autoYes,
        );
      }
      return _runSingleConfig(
        loader: () => Config.loadConfigFromPath(resolved.path!, ''),
        logger: logger,
        prefix: prefix,
        requestedFlavors: flavors,
        allFlavors: allFlavors,
        listFlavors: listFlavors,
        strict: strict,
        autoYes: autoYes,
      );

    case ConfigSourceKind.legacyFlavors:
      return _runLegacyFlavors(
        prefix: prefix,
        logger: logger,
        requestedFlavors: flavors,
        allFlavors: allFlavors,
        listFlavors: listFlavors,
        continueOnError: continueOnError,
        strict: strict,
        autoYes: autoYes,
      );

    case ConfigSourceKind.singleFile:
      return _runSingleConfig(
        loader: () => Config.loadConfigFromPath(resolved.path!, ''),
        logger: logger,
        prefix: prefix,
        requestedFlavors: flavors,
        allFlavors: allFlavors,
        listFlavors: listFlavors,
        strict: strict,
        autoYes: autoYes,
      );

    case ConfigSourceKind.pubspecInline:
      return _runSingleConfig(
        loader: () => Config.loadConfigFromPubSpec(prefix),
        logger: logger,
        prefix: prefix,
        requestedFlavors: flavors,
        allFlavors: allFlavors,
        listFlavors: listFlavors,
        strict: strict,
        autoYes: autoYes,
      );
  }
}