diff options
-rw-r--r-- | crates/paths/src/lib.rs | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/crates/paths/src/lib.rs b/crates/paths/src/lib.rs index 190c50913..32267f2e6 100644 --- a/crates/paths/src/lib.rs +++ b/crates/paths/src/lib.rs | |||
@@ -95,6 +95,80 @@ impl AbsPath { | |||
95 | pub fn normalize(&self) -> AbsPathBuf { | 95 | pub fn normalize(&self) -> AbsPathBuf { |
96 | AbsPathBuf(normalize_path(&self.0)) | 96 | AbsPathBuf(normalize_path(&self.0)) |
97 | } | 97 | } |
98 | pub fn to_path_buf(&self) -> AbsPathBuf { | ||
99 | AbsPathBuf::try_from(self.0.to_path_buf()).unwrap() | ||
100 | } | ||
101 | pub fn strip_prefix(&self, base: &AbsPath) -> Option<&RelPath> { | ||
102 | self.0.strip_prefix(base).ok().map(RelPath::new_unchecked) | ||
103 | } | ||
104 | } | ||
105 | |||
106 | #[derive(Debug, Clone, Ord, PartialOrd, Eq, PartialEq, Hash)] | ||
107 | pub struct RelPathBuf(PathBuf); | ||
108 | |||
109 | impl From<RelPathBuf> for PathBuf { | ||
110 | fn from(RelPathBuf(path_buf): RelPathBuf) -> PathBuf { | ||
111 | path_buf | ||
112 | } | ||
113 | } | ||
114 | |||
115 | impl ops::Deref for RelPathBuf { | ||
116 | type Target = RelPath; | ||
117 | fn deref(&self) -> &RelPath { | ||
118 | self.as_path() | ||
119 | } | ||
120 | } | ||
121 | |||
122 | impl AsRef<Path> for RelPathBuf { | ||
123 | fn as_ref(&self) -> &Path { | ||
124 | self.0.as_path() | ||
125 | } | ||
126 | } | ||
127 | |||
128 | impl TryFrom<PathBuf> for RelPathBuf { | ||
129 | type Error = PathBuf; | ||
130 | fn try_from(path_buf: PathBuf) -> Result<RelPathBuf, PathBuf> { | ||
131 | if !path_buf.is_relative() { | ||
132 | return Err(path_buf); | ||
133 | } | ||
134 | Ok(RelPathBuf(path_buf)) | ||
135 | } | ||
136 | } | ||
137 | |||
138 | impl TryFrom<&str> for RelPathBuf { | ||
139 | type Error = PathBuf; | ||
140 | fn try_from(path: &str) -> Result<RelPathBuf, PathBuf> { | ||
141 | RelPathBuf::try_from(PathBuf::from(path)) | ||
142 | } | ||
143 | } | ||
144 | |||
145 | impl RelPathBuf { | ||
146 | pub fn as_path(&self) -> &RelPath { | ||
147 | RelPath::new_unchecked(self.0.as_path()) | ||
148 | } | ||
149 | } | ||
150 | |||
151 | #[derive(Debug, Ord, PartialOrd, Eq, PartialEq, Hash)] | ||
152 | #[repr(transparent)] | ||
153 | pub struct RelPath(Path); | ||
154 | |||
155 | impl ops::Deref for RelPath { | ||
156 | type Target = Path; | ||
157 | fn deref(&self) -> &Path { | ||
158 | &self.0 | ||
159 | } | ||
160 | } | ||
161 | |||
162 | impl AsRef<Path> for RelPath { | ||
163 | fn as_ref(&self) -> &Path { | ||
164 | &self.0 | ||
165 | } | ||
166 | } | ||
167 | |||
168 | impl RelPath { | ||
169 | pub fn new_unchecked(path: &Path) -> &RelPath { | ||
170 | unsafe { &*(path as *const Path as *const RelPath) } | ||
171 | } | ||
98 | } | 172 | } |
99 | 173 | ||
100 | // https://github.com/rust-lang/cargo/blob/79c769c3d7b4c2cf6a93781575b7f592ef974255/src/cargo/util/paths.rs#L60-L85 | 174 | // https://github.com/rust-lang/cargo/blob/79c769c3d7b4c2cf6a93781575b7f592ef974255/src/cargo/util/paths.rs#L60-L85 |