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

final _defaultDependenciesZoneKey = Symbol('buildConfigDefaultDependencies');
final _packageZoneKey = Symbol('buildConfigPackage');

T runInBuildConfigZone<T>(
        T fn(), String package, List<String> defaultDependencies) =>
    runZoned(fn, zoneValues: {
      _packageZoneKey: package,
      _defaultDependenciesZoneKey: defaultDependencies,
    });

String get currentPackage {
  var package = Zone.current[_packageZoneKey] as String;
  if (package == null) {
    throw StateError(
        'Must be running inside a build config zone, which can be done using '
        'the `runInBuildConfigZone` function.');
  }
  return package;
}

List<String> get currentPackageDefaultDependencies {
  var defaultDependencies =
      Zone.current[_defaultDependenciesZoneKey] as List<String>;
  if (defaultDependencies == null) {
    throw StateError(
        'Must be running inside a build config zone, which can be done using '
        'the `runInBuildConfigZone` function.');
  }
  return defaultDependencies;
}
