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