run method

  1. @override
Future<int> run(
  1. Iterable<String> args
)
override

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

@override
Future<int> run(Iterable<String> args) async {
  final logger = locator<LoggerService>();
  try {
    final argResults = parse(args);

    if (argResults['json'] == true) {
      logger.enableJsonOutput();
    } else if (argResults['quiet'] == true) {
      logger.setLogLevel(Level.quiet);
    } else if (argResults['verbose'] == true) {
      logger.setLogLevel(Level.verbose);
    }

    return await runCommand(argResults) ?? 0;
  } on FormatException catch (e) {
    logger.error(e.message);
    logger.info(usage);
    return 64; // usage error
  } on UsageException catch (e) {
    logger.error(e.message);
    logger.info(e.usage);
    return 64; // usage error
  } on CliException catch (e) {
    logger.error(e.message, e.cause, e.stackTrace);
    return e.exitCode;
  } catch (e, stackTrace) {
    logger.error('An unexpected error occurred.', e, stackTrace);
    return 1;
  }
}