run method

  1. @Deprecated('Do not use this method directly. Use `safeRun` instead.')
  2. @protected
  3. @override
Future<int> run(
  1. Iterable<String> args
)
inherited

Parses args and invokes Command.run on the chosen command.

This always returns a Future in case the command is asynchronous. The Future will throw a UsageException if args was invalid.

Implementation

@Deprecated('Do not use this method directly. Use `safeRun` instead.')
@protected
@override
Future<int> run(Iterable<String> args) async {
  int exitCode;

  try {
    final p = parse(args);
    final logLevel = p.option('log-level') ?? LogLevel.error.name;
    logger.level = LogLevel.values.byName(logLevel);
    logger.trace('log level set to $logLevel');
    final result = await runCommand(p) ?? ExitCode.success.code;
    exitCode = result;
  } on FormatException catch (e) {
    console
      ..write(errorAppDescription)
      ..writeMessage(e.message, style: MessageStyle.error)
      ..writeln('')
      ..write(usage);
    logger.trace(e.toString());
    exitCode = ExitCode.software.code;
  } on UsageException catch (e) {
    console
      ..write(errorAppDescription)
      ..write(console.theme.prefixError(''))
      ..write(console.theme.colors.error(e.message.trimRight()))
      ..write('\n')
      // ..writeMessage(e.message, style: MessageStyle.error)
      ..write(e.usage);
    logger.trace(e.message);
    exitCode = ExitCode.usage.code;
  } catch (e) {
    console
      ..write(errorAppDescription)
      ..writeMessage(e.toString(), style: MessageStyle.error);
    logger.trace(e.toString());

    exitCode = ExitCode.software.code;
  }
  logger.flush();
  stdout.write('\x1b[m');
  return exitCode;
}