| // Copyright (c) 2018, 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 'package:file/file.dart'; |
| import 'package:path/path.dart' as p; |
| |
| /// Class that represents the path style that a memory file system should |
| /// adopt. |
| /// |
| /// This is primarily useful if you want to test how your code will behave |
| /// when faced with particular paths or particular path separator characters. |
| /// For instance, you may want to test that your code will work on Windows, |
| /// while still using a memory file system in order to gain hermeticity in your |
| /// tests. |
| abstract class FileSystemStyle { |
| const FileSystemStyle._(); |
| |
| /// Mimics the Unix file system style. |
| /// |
| /// * This style does not have the notion of drives |
| /// * All file system paths are rooted at `/` |
| /// * The path separator is `/` |
| /// |
| /// An example path in this style is `/path/to/file`. |
| static const FileSystemStyle posix = _Posix(); |
| |
| /// Mimics the Windows file system style. |
| /// |
| /// * This style mounts its root folder on a single root drive (`C:`) |
| /// * All file system paths are rooted at `C:\` |
| /// * The path separator is `\` |
| /// |
| /// An example path in this style is `C:\path\to\file`. |
| static const FileSystemStyle windows = _Windows(); |
| |
| /// The drive upon which the root directory is mounted. |
| /// |
| /// While real-world file systems that have the notion of drives will support |
| /// multiple drives per system, memory file system will only support one |
| /// root drive. |
| /// |
| /// This will be the empty string for styles that don't have the notion of |
| /// drives (e.g. [posix]). |
| String get drive; |
| |
| /// The String that represents the delineation between a directory and its |
| /// children. |
| String get separator; |
| |
| /// The string that represents the root of the file system. |
| /// |
| /// Memory file system is always single-rooted. |
| String get root => '$drive$separator'; |
| |
| /// Gets an object useful for manipulating paths in this style. |
| /// |
| /// Relative path manipulations will be relative to the specified [path]. |
| p.Context contextFor(String path); |
| } |
| |
| class _Posix extends FileSystemStyle { |
| const _Posix() : super._(); |
| |
| @override |
| String get drive => ''; |
| |
| @override |
| String get separator { |
| return p.Style.posix.separator; // ignore: deprecated_member_use |
| } |
| |
| @override |
| p.Context contextFor(String path) => |
| p.Context(style: p.Style.posix, current: path); |
| } |
| |
| class _Windows extends FileSystemStyle { |
| const _Windows() : super._(); |
| |
| @override |
| String get drive => 'C:'; |
| |
| @override |
| String get separator { |
| return p.Style.windows.separator; // ignore: deprecated_member_use |
| } |
| |
| @override |
| p.Context contextFor(String path) => |
| p.Context(style: p.Style.windows, current: path); |
| } |
| |
| /// A file system that supports different styles. |
| abstract class StyleableFileSystem implements FileSystem { |
| /// The style used by this file system. |
| FileSystemStyle get style; |
| } |