| // 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 'dart:convert'; |
| import 'dart:io'; |
| |
| import '../source_code.dart'; |
| |
| /// Where formatted code results should go. |
| class Output { |
| /// Overwrite files on disc. |
| static const Output write = _WriteOutput(); |
| |
| /// Print the code to the terminal as human-friendly text. |
| static const Output show = _ShowOutput(); |
| |
| /// Print the code to the terminal as JSON. |
| static const Output json = _JsonOutput(); |
| |
| /// Do nothing. (Used when the user just wants the list of files that would |
| /// be changed.) |
| static const Output none = Output._(); |
| |
| const Output._(); |
| |
| /// Write the file to disc. |
| bool writeFile(File file, String displayPath, SourceCode result) => false; |
| |
| /// Print the file to the terminal in some way. |
| void showFile(String path, SourceCode result) {} |
| } |
| |
| class _WriteOutput extends Output { |
| const _WriteOutput() : super._(); |
| |
| @override |
| bool writeFile(File file, String displayPath, SourceCode result) { |
| try { |
| file.writeAsStringSync(result.text); |
| } on FileSystemException catch (err) { |
| stderr.writeln('Could not overwrite $displayPath: ' |
| '${err.osError.message} (error code ${err.osError.errorCode})'); |
| } |
| |
| return true; |
| } |
| } |
| |
| class _ShowOutput extends Output { |
| const _ShowOutput() : super._(); |
| |
| @override |
| void showFile(String path, SourceCode result) { |
| // Don't add an extra newline. |
| stdout.write(result.text); |
| } |
| } |
| |
| class _JsonOutput extends Output { |
| const _JsonOutput() : super._(); |
| |
| @override |
| void showFile(String path, SourceCode result) { |
| // TODO(rnystrom): Put an empty selection in here to remain compatible with |
| // the old formatter. Since there's no way to pass a selection on the |
| // command line, this will never be used, which is why it's hard-coded to |
| // -1, -1. If we add support for passing in a selection, put the real |
| // result here. |
| print(jsonEncode({ |
| 'path': path, |
| 'source': result.text, |
| 'selection': { |
| 'offset': result.selectionStart ?? -1, |
| 'length': result.selectionLength ?? -1 |
| } |
| })); |
| } |
| } |