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(stderr, '');
    return ExitCode.usage;
  }

  final parser = _buildArgParser();

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

    if (results.flag('help')) {
      _printUsage(stdout, parser.usage);
      return ExitCode.success;
    }

    if (results.flag('version')) {
      stdout.writeln('dapper $packageVersion');
      return ExitCode.success;
    }

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

    final outputMode = OutputMode.fromString(results.option('output')!);
    final setExitIfChanged = results.flag('set-exit-if-changed');
    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(stderr, parser.usage);
    return ExitCode.usage;
  }
}