| // 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. |
| enum Output { |
| /// Overwrite files on disc. |
| write, |
| |
| /// Print the code to the terminal as human-friendly text. |
| show, |
| |
| /// Print the code to the terminal as JSON. |
| json, |
| |
| /// Do nothing. (Used when the user just wants the list of files that would |
| /// be changed.) |
| none; |
| |
| /// Write the file to disc. |
| /// |
| /// If stdin is being formatted, then [file] is `null`. |
| bool writeFile(File? file, String displayPath, SourceCode result) { |
| if (this != Output.write) return false; |
| |
| 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; |
| } |
| |
| /// Print the file to the terminal in some way. |
| void showFile(String path, SourceCode result) { |
| switch (this) { |
| case Output.show: |
| // Don't add an extra newline. |
| stdout.write(result.text); |
| break; |
| |
| case Output.json: |
| // 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, |
| }, |
| }), |
| ); |
| break; |
| |
| case Output.write: |
| case Output.none: |
| // Do nothing. |
| break; |
| } |
| } |
| } |