dart-sdk/tools/yaml2json.dart
Devon Carew c4dc032f6c [repo] improve the analysis of the tools/ directory
Change-Id: I4185e3bdc1f0f6f8464ebc2a043254200e3df486
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/233502
Reviewed-by: Samuel Rawlins <srawlins@google.com>
Commit-Queue: Devon Carew <devoncarew@google.com>
2022-02-17 19:09:52 +00:00

70 lines
2.3 KiB
Dart

// Copyright (c) 2017, 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' show JsonEncoder;
import 'dart:io' show File, exit, stderr;
import 'dart:isolate' show RawReceivePort;
import 'package:yaml/yaml.dart' show loadYaml;
main(List<String> rawArguments) {
var port = RawReceivePort();
bool check = false;
String? relative;
List<String> arguments = [];
for (String argument in rawArguments) {
if (argument == '--check') {
check = true;
} else if (argument.startsWith('--relative=')) {
relative = argument.substring('--relative='.length);
} else {
arguments.add(argument);
}
}
if (arguments.length != 2) {
stderr.writeln("Usage: yaml2json.dart input.yaml output.json [--check]");
exit(1);
}
Uri input = File(arguments[0]).absolute.uri;
Uri output = File(arguments[1]).absolute.uri;
String inputString = arguments[0];
String outputString = arguments[1];
if (relative != null) {
String relativeTo = File(relative).absolute.uri.toString();
if (input.toString().startsWith(relativeTo)) {
inputString = input.toString().substring(relativeTo.length);
}
if (output.toString().startsWith(relativeTo)) {
outputString = output.toString().substring(relativeTo.length);
}
}
Map yaml = loadYaml(File.fromUri(input).readAsStringSync());
Map<String, dynamic> result = <String, dynamic>{};
result["comment:0"] = "NOTE: THIS FILE IS GENERATED. DO NOT EDIT.";
result["comment:1"] =
"Instead modify '$inputString' and follow the instructions therein.";
for (String key in yaml.keys) {
result[key] = yaml[key];
}
File file = File.fromUri(output);
String text = const JsonEncoder.withIndent(" ").convert(result);
if (check) {
bool needsUpdate = true;
if (file.existsSync()) {
String existingText = file.readAsStringSync();
needsUpdate = text != existingText;
}
if (needsUpdate) {
stderr.write('''
The file $outputString is not up to date. Regenerate using
dart tools/yaml2json.dart $inputString $outputString
''');
exit(1);
}
} else {
file.writeAsStringSync(text);
}
port.close();
}