blob: 701c9d05ec559029efb902ec7360ac5351b12884 [file] [log] [blame]
// 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;
}