| 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; |
| } |