// Copyright (c) 2015, 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.

/// A command-line tool that verifies that deferred libraries split the code as
/// expected.
/// This tool checks that the output from dart2js meets a given specification,
/// given in a YAML file. The format of the YAML file is:
///
///     main:
///       packages:
///         - some_package
///         - other_package
///
///     foo:
///       packages:
///         - foo
///         - bar
///
///     baz:
///       packages:
///         - baz
///         - quux
///
/// The YAML file consists of a list of declarations, one for each deferred
/// part expected in the output. At least one of these parts must be named
/// "main"; this is the main part that contains the program entrypoint. Each
/// top-level part contains a list of package names that are expected to be
/// contained in that part. Any package that is not explicitly listed is
/// expected to be in the main part. For instance, in the example YAML above
/// the part named "baz" is expected to contain the packages "baz" and "quux".
///
/// The names for parts given in the specification YAML file (besides "main")
/// are arbitrary and just used for reporting when the output does not meet the
/// specification.
library dart2js_info.bin.deferred_library_check;

import 'dart:async';
import 'dart:io';

import 'package:dart2js_info/deferred_library_check.dart';
import 'package:dart2js_info/src/util.dart';
import 'package:yaml/yaml.dart';

Future main(List<String> args) async {
  if (args.length < 2) {
    usage();
    exit(1);
  }
  var info = await infoFromFile(args[0]);
  var manifest = await manifestFromFile(args[1]);

  var failures = checkDeferredLibraryManifest(info, manifest);
  failures.forEach(print);
  if (failures.isNotEmpty) exitCode = 1;
}

Future manifestFromFile(String fileName) async {
  var file = await new File(fileName).readAsString();
  return loadYaml(file);
}

void usage() {
  print('''
usage: dart2js_info_deferred_library_check dump.info.json manifest.yaml''');
}
