// Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import 'dart:async'; import 'dart:io'; import 'package:args/command_runner.dart'; import 'package:logging/logging.dart'; import 'package:stack_trace/stack_trace.dart'; import 'src/commands/build.dart'; import 'src/commands/cache.dart'; import 'src/commands/daemon.dart'; import 'src/commands/flutter_command_runner.dart'; import 'src/commands/init.dart'; import 'src/commands/install.dart'; import 'src/commands/list.dart'; import 'src/commands/listen.dart'; import 'src/commands/logs.dart'; import 'src/commands/run_mojo.dart'; import 'src/commands/start.dart'; import 'src/commands/stop.dart'; import 'src/commands/test.dart'; import 'src/commands/trace.dart'; import 'src/commands/upgrade.dart'; import 'src/process.dart'; /// Main entry point for commands. /// /// This function is intended to be used from the [flutter] command line tool. Future main(List args) async { // This level can be adjusted by users through the `--verbose` option. Logger.root.level = Level.WARNING; Logger.root.onRecord.listen((LogRecord record) { String level = record.level.name.toLowerCase(); if (record.level >= Level.WARNING) { stderr.writeln('$level: ${record.message}'); } else { print('$level: ${record.message}'); } if (record.error != null) stderr.writeln(record.error); if (record.stackTrace != null) stderr.writeln(record.stackTrace); }); FlutterCommandRunner runner = new FlutterCommandRunner() ..addCommand(new BuildCommand()) ..addCommand(new CacheCommand()) ..addCommand(new DaemonCommand()) ..addCommand(new InitCommand()) ..addCommand(new InstallCommand()) ..addCommand(new ListCommand()) ..addCommand(new ListenCommand()) ..addCommand(new LogsCommand()) ..addCommand(new RunMojoCommand()) ..addCommand(new StartCommand()) ..addCommand(new StopCommand()) ..addCommand(new TestCommand()) ..addCommand(new TraceCommand()) ..addCommand(new UpgradeCommand()); return Chain.capture(() async { dynamic result = await runner.run(args); if (result is int) exit(result); }, onError: (error, Chain chain) { if (error is UsageException) { stderr.writeln(error); // Argument error exit code. exit(64); } else if (error is ProcessExit) { // We've caught an exit code. exit(error.exitCode); } else { stderr.writeln(error); Logger.root.log(Level.SEVERE, '\nException:', null, chain.terse.toTrace()); exit(1); } }); }