|  | // Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file | 
|  | // for details. All rights reserved. Use of this source code is governed by a | 
|  | // BSD-style license that can be found in the LICENSE file. | 
|  |  | 
|  | import 'package:args/args.dart'; | 
|  | import 'package:args/command_runner.dart'; | 
|  | import 'package:cli_util/cli_logging.dart'; | 
|  | import 'package:dartdev/src/commands/fix.dart'; | 
|  | import 'package:dartdev/src/core.dart'; | 
|  | import 'package:dartdev/src/utils.dart'; | 
|  |  | 
|  | Future<int?> main(List<String> args) async { | 
|  | var runner = FixRunner(logger: Logger.standard()); | 
|  | var result = await runner.runFix(args); | 
|  | return result.returnCode; | 
|  | } | 
|  |  | 
|  | class CapturedProgress extends Progress { | 
|  | final LoggerOutput output; | 
|  |  | 
|  | bool canceled = false; | 
|  | bool finished = false; | 
|  |  | 
|  | CapturedProgress(this.output, String message) : super(message) { | 
|  | output.progress.writeln(message); | 
|  | } | 
|  |  | 
|  | @override | 
|  | void cancel() { | 
|  | canceled = true; | 
|  | } | 
|  |  | 
|  | @override | 
|  | void finish({String? message, bool showTiming = false}) { | 
|  | // todo (pq): consider capturing / tracking finish display updates. | 
|  | finished = true; | 
|  | } | 
|  | } | 
|  |  | 
|  | class CapturingLogger implements Logger { | 
|  | final LoggerOutput output = LoggerOutput(); | 
|  |  | 
|  | @override | 
|  | final Ansi ansi = Ansi(Ansi.terminalSupportsAnsi); | 
|  |  | 
|  | @override | 
|  | bool isVerbose; | 
|  |  | 
|  | CapturingLogger({this.isVerbose = false}); | 
|  |  | 
|  | @override | 
|  | void flush() { | 
|  | // deprecated. | 
|  | } | 
|  |  | 
|  | @override | 
|  | Progress progress(String message) => CapturedProgress(output, message); | 
|  |  | 
|  | @override | 
|  | void stderr(String message) { | 
|  | output.stderr.writeln(message); | 
|  | } | 
|  |  | 
|  | @override | 
|  | void stdout(String message) { | 
|  | output.stdout.writeln(message); | 
|  | } | 
|  |  | 
|  | @override | 
|  | void trace(String message) { | 
|  | output.trace.writeln(message); | 
|  | } | 
|  |  | 
|  | @override | 
|  | void write(String message) { | 
|  | output.stdout.write(message); | 
|  | } | 
|  |  | 
|  | @override | 
|  | void writeCharCode(int charCode) { | 
|  | output.stdout.writeCharCode(charCode); | 
|  | } | 
|  | } | 
|  |  | 
|  | class FixResult<T extends Logger> { | 
|  | /// The value returned by [FixCommand.run]. | 
|  | final int? returnCode; | 
|  |  | 
|  | /// The logger used in driving fixes. | 
|  | final T logger; | 
|  |  | 
|  | FixResult(this.logger, this.returnCode); | 
|  | } | 
|  |  | 
|  | class FixRunner<T extends Logger> extends CommandRunner<int> { | 
|  | final _supportedOptions = ['dry-run', 'apply']; | 
|  |  | 
|  | T logger; | 
|  |  | 
|  | @override | 
|  | final ArgParser argParser = ArgParser( | 
|  | usageLineLength: dartdevUsageLineLength, | 
|  | allowTrailingOptions: false, | 
|  | ); | 
|  |  | 
|  | FixRunner({required this.logger}) | 
|  | : super('fix_runner', | 
|  | 'A command-line utility for testing the `dart fix` command.') { | 
|  | addCommand(FixCommand()); | 
|  | _supportedOptions.forEach(argParser.addOption); | 
|  | } | 
|  |  | 
|  | @override | 
|  | Future<int?> runCommand(ArgResults topLevelResults) async { | 
|  | var result = await super.runCommand(topLevelResults); | 
|  | return result; | 
|  | } | 
|  |  | 
|  | Future<FixResult<T>> runFix(List<String> args) async { | 
|  | log = logger; | 
|  | var argResults = argParser.parse(['fix', ...args]); | 
|  | var result = await runCommand(argResults); | 
|  | return FixResult(logger, result); | 
|  | } | 
|  | } | 
|  |  | 
|  | class LoggerOutput { | 
|  | /// Messages reported to progress. | 
|  | final StringBuffer progress = StringBuffer(); | 
|  |  | 
|  | /// Messages reported to stdout. | 
|  | final StringBuffer stdout = StringBuffer(); | 
|  |  | 
|  | /// Messages reported to stderr. | 
|  | final StringBuffer stderr = StringBuffer(); | 
|  |  | 
|  | /// Messages reported to trace. | 
|  | final StringBuffer trace = StringBuffer(); | 
|  | } |