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 args = argResults!;
  final workflowDir = args['dir'] as String;
  final verbose = args['verbose'] as bool;

  // Check if workflow directory exists
  final dir = Directory(workflowDir);
  if (!dir.existsSync()) {
    stderr.writeln('Error: Workflow directory not found: $workflowDir');
    stderr.writeln('');
    stderr.writeln(
      'Run "dart run gha_cli init [workflow-name]" to create a workflow script',
    );
    return 1;
  }

  // Find all .dart files in the workflow directory
  final dartFiles = dir
      .listSync()
      .whereType<File>()
      .where((f) => f.path.endsWith('.dart'))
      .toList();

  if (dartFiles.isEmpty) {
    stderr.writeln('Error: No workflow scripts found in $workflowDir/');
    stderr.writeln('');
    stderr.writeln(
      'Run "dart run gha_cli init [workflow-name]" to create a workflow script',
    );
    return 1;
  }

  if (verbose) {
    stdout.writeln('Found ${dartFiles.length} workflow script(s)');
    stdout.writeln('');
  }

  var hasErrors = false;
  var successCount = 0;

  // Execute each workflow script
  for (final file in dartFiles) {
    final scriptName = p.basename(file.path);

    if (verbose) {
      stdout.writeln('Executing: $scriptName');
    }

    final result = await Process.run('dart', [
      'run',
      file.path,
    ], runInShell: true);

    if (result.exitCode != 0) {
      stderr.writeln('✗ Error executing $scriptName');
      if (result.stderr.toString().isNotEmpty) {
        stderr.writeln(result.stderr);
      }
      hasErrors = true;
      continue;
    }

    // The script's output (from workflow.save()) is printed to stdout
    final output = result.stdout.toString();
    if (output.isNotEmpty) {
      stdout.write(output);
    }

    successCount++;
  }

  stdout.writeln('');
  if (hasErrors) {
    stdout.writeln(
      '⚠ Generated $successCount/${dartFiles.length} workflow(s) with errors',
    );
    return 1;
  } else {
    stdout.writeln('✓ Successfully generated $successCount workflow(s)');
    return 0;
  }
}