// 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. import 'source.dart'; import 'source/git.dart'; import 'source/hosted.dart'; import 'source/path.dart'; import 'source/sdk.dart'; import 'source/unknown.dart'; /// A class that keeps track of [Source]s used for getting packages. class SourceRegistry { /// The registered sources. /// /// This is initialized with the three built-in sources. final _sources = { "git": new GitSource(), "hosted": new HostedSource(), "path": new PathSource(), "sdk": new SdkSource() }; /// The default source, which is used when no source is specified. /// /// This defaults to [hosted]. Source get defaultSource => _default; Source _default; /// The registered sources, in name order. List<Source> get all { var sources = _sources.values.toList(); sources.sort((a, b) => a.name.compareTo(b.name)); return sources; } /// The built-in [GitSource]. GitSource get git => _sources["git"] as GitSource; /// The built-in [HostedSource]. HostedSource get hosted => _sources["hosted"] as HostedSource; /// The built-in [PathSource]. PathSource get path => _sources["path"] as PathSource; /// The built-in [SdkSource]. SdkSource get sdk => _sources["sdk"] as SdkSource; SourceRegistry() { _default = hosted; } /// Sets the default source. /// /// This takes a string, which must be the name of a registered source. void setDefault(String name) { if (!_sources.containsKey(name)) { throw new StateError('Default source $name is not in the registry'); } _default = _sources[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 (_sources.containsKey(source.name)) { throw new StateError('Source registry already has a source named ' '${source.name}'); } _sources[source.name] = source; } /// Returns the source named [name]. /// /// Returns an [UnknownSource] if no source with that name has been /// registered. If [name] is null, returns the default source. Source operator [](String name) { if (name == null) return _default; if (_sources.containsKey(name)) return _sources[name]; return new UnknownSource(name); } }