diff options
Diffstat (limited to 'crates/vfs/src/vfs_path.rs')
-rw-r--r-- | crates/vfs/src/vfs_path.rs | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/crates/vfs/src/vfs_path.rs b/crates/vfs/src/vfs_path.rs new file mode 100644 index 000000000..de5dc0bf3 --- /dev/null +++ b/crates/vfs/src/vfs_path.rs | |||
@@ -0,0 +1,49 @@ | |||
1 | //! Abstract-ish representation of paths for VFS. | ||
2 | use std::fmt; | ||
3 | |||
4 | use paths::{AbsPath, AbsPathBuf}; | ||
5 | |||
6 | /// Long-term, we want to support files which do not reside in the file-system, | ||
7 | /// so we treat VfsPaths as opaque identifiers. | ||
8 | #[derive(Debug, Clone, Ord, PartialOrd, Eq, PartialEq, Hash)] | ||
9 | pub struct VfsPath(VfsPathRepr); | ||
10 | |||
11 | impl VfsPath { | ||
12 | pub fn as_path(&self) -> Option<&AbsPath> { | ||
13 | match &self.0 { | ||
14 | VfsPathRepr::PathBuf(it) => Some(it.as_path()), | ||
15 | } | ||
16 | } | ||
17 | pub fn join(&self, path: &str) -> VfsPath { | ||
18 | match &self.0 { | ||
19 | VfsPathRepr::PathBuf(it) => { | ||
20 | let res = it.join(path).normalize(); | ||
21 | VfsPath(VfsPathRepr::PathBuf(res)) | ||
22 | } | ||
23 | } | ||
24 | } | ||
25 | pub fn pop(&mut self) -> bool { | ||
26 | match &mut self.0 { | ||
27 | VfsPathRepr::PathBuf(it) => it.pop(), | ||
28 | } | ||
29 | } | ||
30 | } | ||
31 | |||
32 | #[derive(Debug, Clone, Ord, PartialOrd, Eq, PartialEq, Hash)] | ||
33 | enum VfsPathRepr { | ||
34 | PathBuf(AbsPathBuf), | ||
35 | } | ||
36 | |||
37 | impl From<AbsPathBuf> for VfsPath { | ||
38 | fn from(v: AbsPathBuf) -> Self { | ||
39 | VfsPath(VfsPathRepr::PathBuf(v)) | ||
40 | } | ||
41 | } | ||
42 | |||
43 | impl fmt::Display for VfsPath { | ||
44 | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { | ||
45 | match &self.0 { | ||
46 | VfsPathRepr::PathBuf(it) => fmt::Display::fmt(&it.display(), f), | ||
47 | } | ||
48 | } | ||
49 | } | ||