// 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 pub.source_registry;

import 'source.dart';

/// A class that keeps track of [Source]s used for getting 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)) {
      throw new StateError('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)) {
      throw new StateError('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.
  // TODO(rnystrom): Return a NullSource that does nothing safely so that
  // calling code doesn't have to worry about it.
  Source operator[](String name) {
    if (name == null) {
      if (defaultSource != null) return defaultSource;
      throw new StateError('No default source has been registered');
    }
    if (_map.containsKey(name)) return _map[name];
    throw new ArgumentError('No source named $name is registered');
  }
}
