run method

ExitCode run(
  1. List<String> arguments
)

Runs the CLI with the given arguments.

Returns the exit code.

Implementation

ExitCode run(List<String> arguments) {
  // Fast path: no arguments means no files specified
  if (arguments.isEmpty) {
    stderr.writeln(_noFilesError);
    _printUsage('');
    return ExitCode.error;
  }

  final parser = _buildArgParser();

  try {
    final results = parser.parse(arguments);

    if (results['help'] as bool) {
      _printUsage(parser.usage);
      return ExitCode.success;
    }

    final paths = results.rest;
    if (paths.isEmpty) {
      stderr.writeln(_noFilesError);
      _printUsage(parser.usage);
      return ExitCode.error;
    }

    final outputMode = OutputMode.fromString(results['output'] as String);
    final setExitIfChanged = results['set-exit-if-changed'] as bool;
    final options = _resolveOptions(results);

    final stopwatch = Stopwatch()..start();
    final result = _processPaths(paths, outputMode, options);
    stopwatch.stop();

    if (outputMode == OutputMode.write) {
      final elapsed = stopwatch.elapsed.inMilliseconds / 1000.0;
      final timeStr = elapsed.toStringAsFixed(2);
      final sentence = result.changedFiles == 0
          ? 'Formatted ${result.totalFiles} files'
          : 'Formatted ${result.totalFiles} files (${result.changedFiles} changed)';
      stdout.writeln('$sentence in $timeStr seconds.');
    }

    if (result.status == ProcessResult.error) {
      return ExitCode.error;
    }
    if (setExitIfChanged && result.status == ProcessResult.changed) {
      return ExitCode.changed;
    }
    return ExitCode.success;
  } on FormatException catch (e) {
    stderr.writeln('Error: ${e.message}');
    _printUsage(parser.usage);
    return ExitCode.error;
  }
}