blob: b8936fe3f0a08b40d16bfc8ee0c0ecf0420c623e [file] [log] [blame]
// 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();
}