protobuf_parse/
rel_path.rsuse std::ops::Deref;
use std::path::Path;
use std::path::PathBuf;
#[repr(transparent)]
pub(crate) struct RelPath {
path: Path,
}
#[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)
}
}