blob: 917e9a302c8196f7e84158865c3a0403a1247f02 [file] [log] [blame]
// 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';
}
}