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