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

library source_registry;

import 'source.dart';

/**
 * A class that keeps track of [Source]s used for installing packages.
 */
class SourceRegistry {
  final Map<String, Source> _map;
  Source _default;

  /**
   * Creates a new registry with no packages registered.
   */
  SourceRegistry() : _map = <String, Source>{};

  /**
   * Returns the default source, which is used when no source is specified.
   */
  Source get defaultSource => _default;

  /**
   * Sets the default source. This takes a string, which must be the name of a
   * registered source.
   */
  void setDefault(String name) {
    if (!_map.containsKey(name)) {
      // TODO(nweiz): Real error-handling system
      throw 'Default source $name is not in the registry';
    }

    _default = _map[name];
  }

  /**
   * Registers a new source. This source may not have the same name as a source
   * that's already been registered.
   */
  void register(Source source) {
    if (_map.containsKey(source.name)) {
      // TODO(nweiz): Real error-handling system
      throw 'Source registry already has a source named ${source.name}';
    }

    _map[source.name] = source;
  }

  /**
   * Returns `true` if there is a source named [name].
   */
  bool contains(String name) => _map.containsKey(name);

  /**
   * Returns the source named [name]. Throws an error if no such source has been
   * registered. If [name] is null, returns the default source.
   */
  Source operator[](String name) {
    if (name == null) {
      if (defaultSource != null) return defaultSource;
      // TODO(nweiz): Real error-handling system
      throw 'No default source has been registered';
    }
    if (_map.containsKey(name)) return _map[name];
    throw 'No source named $name is registered';
  }
}
