1 use std::ops::Deref; 2 use std::path::Path; 3 use std::path::PathBuf; 4 5 /// Wrapper for `Path` that asserts that the path is relative. 6 #[repr(transparent)] 7 pub(crate) struct RelPath { 8 path: Path, 9 } 10 11 /// Wrapper for `PathBuf` that asserts that the path is relative. 12 #[derive(Debug, Clone, PartialEq, Eq, Hash)] 13 pub(crate) struct RelPathBuf { 14 path: PathBuf, 15 } 16 17 impl RelPath { new(path: &Path) -> &RelPath18 pub(crate) fn new(path: &Path) -> &RelPath { 19 assert!( 20 !path.is_absolute(), 21 "path must be relative: {}", 22 path.display() 23 ); 24 unsafe { &*(path as *const Path as *const RelPath) } 25 } 26 _to_owned(&self) -> RelPathBuf27 pub(crate) fn _to_owned(&self) -> RelPathBuf { 28 RelPathBuf { 29 path: self.path.to_owned(), 30 } 31 } 32 } 33 34 impl RelPathBuf { _new(path: PathBuf) -> RelPathBuf35 pub(crate) fn _new(path: PathBuf) -> RelPathBuf { 36 assert!( 37 !path.is_absolute(), 38 "path must be relative: {}", 39 path.display() 40 ); 41 RelPathBuf { path } 42 } 43 } 44 45 impl Deref for RelPath { 46 type Target = Path; 47 deref(&self) -> &Self::Target48 fn deref(&self) -> &Self::Target { 49 &self.path 50 } 51 } 52 53 impl Deref for RelPathBuf { 54 type Target = RelPath; 55 deref(&self) -> &Self::Target56 fn deref(&self) -> &Self::Target { 57 RelPath::new(&self.path) 58 } 59 } 60