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

part of file.src.backends.local;

/// A wrapper implementation around `dart:io`'s implementation.
///
/// Since this implementation of the [FileSystem] interface delegates to
/// `dart:io`, is is not suitable for use in the browser.
class LocalFileSystem extends FileSystem {
  /// Creates a new `LocalFileSystem`.
  const LocalFileSystem();

  @override
  Directory directory(dynamic path) =>
      new _LocalDirectory(this, shim.newDirectory(path));

  @override
  File file(dynamic path) => new _LocalFile(this, shim.newFile(path));

  @override
  Link link(dynamic path) => new _LocalLink(this, shim.newLink(path));

  @override
  p.Context get path => new p.Context();

  /// Gets the directory provided by the operating system for creating temporary
  /// files and directories in. The location of the system temp directory is
  /// platform-dependent, and may be set by an environment variable.
  @override
  Directory get systemTempDirectory =>
      new _LocalDirectory(this, shim.systemTemp());

  @override
  Directory get currentDirectory => directory(shim.currentDirectory.path);

  @override
  set currentDirectory(dynamic path) => shim.currentDirectory = path;

  @override
  Future<io.FileStat> stat(String path) => shim.stat(path);

  @override
  io.FileStat statSync(String path) => shim.statSync(path);

  @override
  Future<bool> identical(String path1, String path2) =>
      shim.identical(path1, path2);

  @override
  bool identicalSync(String path1, String path2) =>
      shim.identicalSync(path1, path2);

  @override
  bool get isWatchSupported => shim.isWatchSupported;

  @override
  Future<io.FileSystemEntityType> type(String path, {bool followLinks: true}) =>
      shim.type(path, followLinks);

  @override
  io.FileSystemEntityType typeSync(String path, {bool followLinks: true}) =>
      shim.typeSync(path, followLinks);
}
