blob: 0a79f0d6d3f639ff4aa45c043e0c65d70d93b163 [file] [log] [blame]
part of file.src.backends.memory;
abstract class _MemoryFileSystemEntity extends SyncFileSystemEntity {
@override
final SyncMemoryFileSystem fileSystem;
@override
final String path;
_MemoryFileSystemEntity(this.fileSystem, this.path);
@override
SyncFileSystemEntity copy(String newPath) {
if (fileSystem.type(newPath) != FileSystemEntityType.NOT_FOUND) {
throw new FileSystemEntityException(
'Unable to copy or move to an existing path', newPath);
}
var parent = _resolve(false);
if (parent != null) {
var reference = _resolve(true, newPath);
Object clone = parent[name];
if (clone is! String) {
clone = cloneSafe(clone);
}
reference[newPath.substring(newPath.lastIndexOf('/') + 1)] = clone;
if (_type == FileSystemEntityType.FILE) {
return new _MemoryFile(fileSystem, newPath);
} else {
return new _MemoryDirectory(fileSystem, newPath);
}
}
throw new FileSystemEntityException('Not found', path);
}
@override
SyncFileSystemEntity create({bool recursive: false}) {
var parent = _resolve(recursive);
if (parent == null) {
throw new FileSystemEntityException('Not found', getParentPath(path));
}
parent.putIfAbsent(name, _createImpl);
return this;
}
/// Override to return a new blank object representing this entity.
Object _createImpl();
@override
SyncFileSystemEntity delete({bool recursive: false}) {
var parent = _resolve(recursive);
if (parent == null) {
throw new FileSystemEntityException('Not found', path);
}
if (_type == FileSystemEntityType.FILE ||
recursive ||
(parent[name] as Map).isEmpty) {
parent.remove(name);
return this;
}
throw new FileSystemEntityException(
'Cannot non-recursively delete a non-empty directory', path);
}
@override
SyncDirectory get parent {
var parentPath = getParentPath(path);
if (parentPath != null) {
return new _MemoryDirectory(
fileSystem, parentPath == '' ? '/' : parentPath);
}
return null;
}
// TODO: Consider promoting to SyncFileSystemEntity.
String get name => path.substring(path.lastIndexOf('/') + 1);
@override
SyncFileSystemEntity rename(String newPath) {
var copied = copy(newPath);
delete(recursive: true);
return copied;
}
Map<String, Object> _resolve(bool recursive, [String path]) {
path ??= this.path;
if (path == '') {
return fileSystem._data;
}
return resolvePath(fileSystem._data, getParentPath(path).split('/'),
recursive: recursive);
}
/// Return what this type is.
FileSystemEntityType get _type;
}