run method

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

Runs this command.

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

Implementation

@override
Future<void> run() async {
  final configPath = argResults?['config'];
  final showConfig = argResults?['show-config'] ?? false;
  final target = argResults?['target'] as String;
  final pipelineName = argResults?['pipeline'] as String?;

  // Load config dynamically or use persisted one
  FlutterReleaseXConfig().loadConfig(configPath);

  if (showConfig) {
    FlutterReleaseXHelpers.showUserConfig();
    return;
  }

  /// Supported platforms for flutter default flow.
  const validPlatforms = {
    'ios',
    'android',
    'web',
    'macos',
    'windows',
    'linux',
  };

  final platforms = target.toLowerCase() == 'all'
      ? validPlatforms
      : target.split(',').map((e) => e.trim()).toSet();

  // Validate platform input
  for (var platform in platforms) {
    if (!validPlatforms.contains(platform)) {
      print('❌ Unsupported platform: $platform');
      exit(1);
    }
  }

  final resolvedPipelines = FlutterReleaseXConfig().config.resolvedPipelines;

  // If a specific pipeline was requested via --pipeline flag
  if (pipelineName != null) {
    if (resolvedPipelines == null || resolvedPipelines.isEmpty) {
      print('❌ No pipelines configured in config.');
      print(
          '   Add "pipelines:" or "pipeline_steps:" to your config.yaml first.');
      print(
          '   Run "frx pipeline help-all" for complete configuration guide.');
      exit(1);
    }

    // Validate before running
    final errors = PipelineConfigValidator.validate(resolvedPipelines);
    final criticalErrors = errors.where((e) => !e.isWarning).toList();
    if (criticalErrors.isNotEmpty) {
      print(
          '❌ Pipeline validation failed. Run "frx pipeline validate" for details.');
      exit(1);
    }

    await FlutterReleaseXHelpers.executePipeline(pipelineName: pipelineName);
    exit(0);
  }

  /// If Advance Pipeline is disabled, use Default Flow
  if (resolvedPipelines == null || resolvedPipelines.isEmpty) {
    await FlutterReleaseXKplatforms.buildAndProcessPlatforms(platforms);
  } else {
    // Validate before running
    final errors = PipelineConfigValidator.validate(resolvedPipelines);
    final criticalErrors = errors.where((e) => !e.isWarning).toList();
    if (criticalErrors.isNotEmpty) {
      print(
          '❌ Pipeline validation failed. Run "frx pipeline validate" for details.');
      exit(1);
    }

    /// Advance Pipeline is enabled, go with user's custom flow
    await FlutterReleaseXHelpers.executePipeline();
    exit(0);
  }
}