blob: 9851268dc2115a1316d3950b364247d87457a358 [file] [log] [blame]
// 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;
}
}
}