From cb2be5a882018c10bcd90b9045ab8b2c48e0678e Mon Sep 17 00:00:00 2001 From: Jiahao XU Date: Sun, 12 Jun 2022 01:46:10 +1000 Subject: [PATCH] Add new trait `PathExt` & impl for `Path` Signed-off-by: Jiahao XU --- src/helpers.rs | 3 +++ src/helpers/path_ext.rs | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 src/helpers/path_ext.rs diff --git a/src/helpers.rs b/src/helpers.rs index 7670b15b..643eda60 100644 --- a/src/helpers.rs +++ b/src/helpers.rs @@ -24,6 +24,9 @@ pub use extracter::TarEntriesVisitor; mod readable_rx; +mod path_ext; +pub use path_ext::*; + /// Load binstall metadata from the crate `Cargo.toml` at the provided path pub fn load_manifest_path>( manifest_path: P, diff --git a/src/helpers/path_ext.rs b/src/helpers/path_ext.rs new file mode 100644 index 00000000..d11c0e7e --- /dev/null +++ b/src/helpers/path_ext.rs @@ -0,0 +1,34 @@ +use std::path::{Component, Path, PathBuf}; + +trait PathExt { + fn normalize_path(&self) -> PathBuf; +} + +impl PathExt for Path { + fn normalize_path(&self) -> PathBuf { + let mut components = self.components().peekable(); + let mut ret = if let Some(c @ Component::Prefix(..)) = components.peek().cloned() { + components.next(); + PathBuf::from(c.as_os_str()) + } else { + PathBuf::new() + }; + + for component in components { + match component { + Component::Prefix(..) => unreachable!(), + Component::RootDir => { + ret.push(component.as_os_str()); + } + Component::CurDir => {} + Component::ParentDir => { + ret.pop(); + } + Component::Normal(c) => { + ret.push(c); + } + } + } + ret + } +}