| // Copyright (c) 2016, 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 front_end.file_system; |
| |
| /// Abstract interface to file system operations. |
| /// |
| /// All front end interaction with the file system goes through this interface; |
| /// this makes it possible for clients to use the front end in a way that |
| /// doesn't require file system access (e.g. to run unit tests, or to run |
| /// inside a browser). |
| /// |
| /// Not intended to be implemented or extended by clients. |
| abstract class FileSystem { |
| /// Returns a [FileSystemEntity] corresponding to the given [uri]. |
| /// |
| /// Uses of `..` and `.` in the URI are normalized before returning. |
| /// |
| /// If the URI scheme is not supported by this file system, an [Error] will be |
| /// thrown. |
| /// |
| /// Does not check whether a file or folder exists at the given location. |
| FileSystemEntity entityForUri(Uri uri); |
| } |
| |
| /// Abstract representation of a file system entity that may or may not exist. |
| /// |
| /// Instances of this class have suitable implementations of equality tests and |
| /// hashCode. |
| /// |
| /// Not intended to be implemented or extended by clients. |
| abstract class FileSystemEntity { |
| /// The absolute normalized URI represented by this file system entity. |
| /// |
| /// Note: this is not necessarily the same as the URI that was passed to |
| /// [FileSystem.entityForUri], since the URI might have been normalized. |
| Uri get uri; |
| |
| /// Whether this file system entity exists. |
| /// |
| /// This method cannot be assumed to do any async work, in fact, if possible |
| /// it should perform the check sync as that might be faster depending on the |
| /// caller. If wanting to check async - for instance if trying to physically |
| /// check for existence and read in parallel - use [existsAsyncIfPossible] |
| /// instead. |
| Future<bool> exists(); |
| |
| /// Whether this file system entity exists. |
| /// |
| /// This method cannot be assumed to do any async work, but should - if |
| /// possible - in fact do async work as that might be faster depending on the |
| /// caller - for instance if trying to physically check for existence (and |
| /// read) in parallel. |
| /// For sequential checks one should use [exists] instead. |
| Future<bool> existsAsyncIfPossible(); |
| |
| /// Attempts to access this file system entity as a file and read its contents |
| /// as raw bytes. |
| /// |
| /// This method cannot be assumed to do any async work, in fact, if possible |
| /// it should the read sync as that might be faster depending on the caller. |
| /// If wanting to read async - for instance if trying to physically read in |
| /// parallel - use [readAsBytesAsyncIfPossible] instead. |
| /// |
| /// If an error occurs while attempting to read the file (e.g. because no such |
| /// file exists, or the entity is a directory), the future is completed with |
| /// [FileSystemException]. |
| Future<List<int>> readAsBytes(); |
| |
| /// Attempts to access this file system entity as a file and read its contents |
| /// as raw bytes. |
| /// |
| /// This method cannot be assumed to do any async work, but should - if |
| /// possible - in fact do async work as that might be faster depending on the |
| /// caller - for instance if trying to physically read in parallel. |
| /// For sequential reads one should use [readAsBytes] instead. |
| /// |
| /// If an error occurs while attempting to read the file (e.g. because no such |
| /// file exists, or the entity is a directory), the future is completed with |
| /// [FileSystemException]. |
| Future<List<int>> readAsBytesAsyncIfPossible(); |
| |
| /// Attempts to access this file system entity as a file and read its contents |
| /// as a string. |
| /// |
| /// The file is assumed to be UTF-8 encoded. |
| /// |
| /// If an error occurs while attempting to read the file (e.g. because no such |
| /// file exists, the entity is a directory, or the file is not valid UTF-8), |
| /// the future is completed with [FileSystemException]. |
| Future<String> readAsString(); |
| } |
| |
| /** |
| * Base class for all file system exceptions. |
| */ |
| class FileSystemException implements Exception { |
| final Uri uri; |
| final String message; |
| |
| FileSystemException(this.uri, this.message); |
| |
| @override |
| String toString() => 'FileSystemException(uri=$uri; message=$message)'; |
| } |
| |
| class NullFileSystem implements FileSystem { |
| const NullFileSystem(); |
| |
| @override |
| FileSystemEntity entityForUri(Uri uri) { |
| throw new UnsupportedError('$runtimeType.entityForUri'); |
| } |
| } |