// 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 'dart:collection';

import 'source.dart';

/// A class that keeps track of [Source]s used for getting packages.
class SourceRegistry extends IterableBase<Source> {
  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;

  /// Iterates over the registered sources in name order.
  Iterator<Source> get iterator {
    var sources = _map.values.toList();
    sources.sort((a, b) => a.name.compareTo(b.name));
    return sources.iterator;
  }

  /// 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');
  }
}
