| // 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; | |
| void 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(); | |
| } |