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

/// Implementations of [Packages] that can only be used in server based
/// applications.
library package_config.packages_io_impl;

import "dart:collection" show UnmodifiableMapView;
import "dart:io" show Directory;
import "package:path/path.dart" as path;
import "packages_impl.dart";

/// A [Packages] implementation based on a local directory.
class FilePackagesDirectoryPackages extends PackagesBase {
  final Directory _packageDir;
  FilePackagesDirectoryPackages(this._packageDir);

  Uri getBase(String packageName) =>
      new Uri.file(path.join(_packageDir.path, packageName, '.'));

  Iterable<String> _listPackageNames() {
    return _packageDir
        .listSync()
        .where((e) => e is Directory)
        .map((e) => path.basename(e.path));
  }

  Iterable<String> get packages => _listPackageNames();

  Map<String, Uri> asMap() {
    var result = <String, Uri>{};
    for (var packageName in _listPackageNames()) {
      result[packageName] = getBase(packageName);
    }
    return new UnmodifiableMapView<String, Uri>(result);
  }
}
