use std::ops::Deref; use std::path::Path; use std::path::PathBuf; /// Wrapper for `Path` that asserts that the path is relative. #[repr(transparent)] pub(crate) struct RelPath { path: Path, } /// Wrapper for `PathBuf` that asserts that the path is relative. #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub(crate) struct RelPathBuf { path: PathBuf, } impl RelPath { pub(crate) fn new(path: &Path) -> &RelPath { assert!( !path.is_absolute(), "path must be relative: {}", path.display() ); unsafe { &*(path as *const Path as *const RelPath) } } pub(crate) fn _to_owned(&self) -> RelPathBuf { RelPathBuf { path: self.path.to_owned(), } } } impl RelPathBuf { pub(crate) fn _new(path: PathBuf) -> RelPathBuf { assert!( !path.is_absolute(), "path must be relative: {}", path.display() ); RelPathBuf { path } } } impl Deref for RelPath { type Target = Path; fn deref(&self) -> &Self::Target { &self.path } } impl Deref for RelPathBuf { type Target = RelPath; fn deref(&self) -> &Self::Target { RelPath::new(&self.path) } }