// Copyright (c) 2016, 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:io';

import 'package:kernel/kernel.dart';

class CommandLineHelper {
  static void requireExactlyOneArgument(
    List<String> args,
    void Function() usage, {
    bool requireFileExists = false,
  }) {
    if (args.length != 1) {
      print("Expected exactly 1 argument, got ${args.length}.");
      usage();
    }
    if (requireFileExists) CommandLineHelper.requireFileExists(args[0]);
  }

  static void requireVariableArgumentCount(
    List<int> ok,
    List<String> args,
    void Function() usage,
  ) {
    if (!ok.contains(args.length)) {
      print(
        "Expected the argument count to be one of ${ok}, got "
        "${args.length}.",
      );
      usage();
    }
  }

  static void requireFileExists(String file) {
    if (!new File(file).existsSync()) {
      print("File $file doesn't exist.");
      exit(1);
    }
  }

  static Component tryLoadDill(String file) {
    try {
      return loadComponentFromBinary(file);
    } catch (e, s) {
      print("$file can't be loaded:");
      print('$e\n$s');
      exit(1);
    }
  }
}
