Skip to content

Commit dda9599

Browse files
committed
deduplicate ToNormalPathComponent logic
1 parent 5cb5337 commit dda9599

File tree

1 file changed

+30
-30
lines changed

1 file changed

+30
-30
lines changed

gix-fs/src/stack.rs

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@ use std::path::{Component, Path, PathBuf};
55

66
///
77
pub mod to_normal_path_components {
8-
use std::ffi::OsString;
8+
use std::path::PathBuf;
99

1010
/// The error used in [`ToNormalPathComponents::to_normal_path_components()`](super::ToNormalPathComponents::to_normal_path_components()).
1111
#[derive(Debug, thiserror::Error)]
1212
#[allow(missing_docs)]
1313
pub enum Error {
14-
#[error("Input path \"{path}\" contains relative or absolute components", path = std::path::Path::new(.0.as_os_str()).display())]
15-
NotANormalComponent(OsString),
14+
#[error("Input path \"{path}\" contains relative or absolute components", path = .0.display())]
15+
NotANormalComponent(PathBuf),
1616
#[error("Could not convert to UTF8 or from UTF8 due to ill-formed input")]
1717
IllegalUtf8,
1818
}
@@ -26,54 +26,54 @@ pub trait ToNormalPathComponents {
2626

2727
impl ToNormalPathComponents for &Path {
2828
fn to_normal_path_components(&self) -> impl Iterator<Item = Result<&OsStr, to_normal_path_components::Error>> {
29-
self.components().map(|component| match component {
30-
Component::Normal(os_str) => Ok(os_str),
31-
_ => Err(to_normal_path_components::Error::NotANormalComponent(
32-
self.as_os_str().to_owned(),
33-
)),
34-
})
29+
self.components().map(|c| component_to_os_str(c, self))
3530
}
3631
}
3732

3833
impl ToNormalPathComponents for PathBuf {
3934
fn to_normal_path_components(&self) -> impl Iterator<Item = Result<&OsStr, to_normal_path_components::Error>> {
40-
self.components().map(|component| match component {
41-
Component::Normal(os_str) => Ok(os_str),
42-
_ => Err(to_normal_path_components::Error::NotANormalComponent(
43-
self.as_os_str().to_owned(),
44-
)),
45-
})
35+
self.components().map(|c| component_to_os_str(c, self))
36+
}
37+
}
38+
39+
fn component_to_os_str<'a>(
40+
component: Component<'a>,
41+
path_with_component: &Path,
42+
) -> Result<&'a OsStr, to_normal_path_components::Error> {
43+
match component {
44+
Component::Normal(os_str) => Ok(os_str),
45+
_ => Err(to_normal_path_components::Error::NotANormalComponent(
46+
path_with_component.to_owned(),
47+
)),
4648
}
4749
}
4850

4951
impl ToNormalPathComponents for &BStr {
5052
fn to_normal_path_components(&self) -> impl Iterator<Item = Result<&OsStr, to_normal_path_components::Error>> {
51-
self.split(|b| *b == b'/').filter(|c| !c.is_empty()).map(|component| {
52-
gix_path::try_from_byte_slice(component.as_bstr())
53-
.map_err(|_| to_normal_path_components::Error::IllegalUtf8)
54-
.map(Path::as_os_str)
55-
})
53+
self.split(|b| *b == b'/').filter_map(bytes_component_to_os_str)
5654
}
5755
}
5856

5957
impl ToNormalPathComponents for &str {
6058
fn to_normal_path_components(&self) -> impl Iterator<Item = Result<&OsStr, to_normal_path_components::Error>> {
61-
self.split('/').filter(|c| !c.is_empty()).map(|component| {
62-
gix_path::try_from_byte_slice(component.as_bytes())
63-
.map_err(|_| to_normal_path_components::Error::IllegalUtf8)
64-
.map(Path::as_os_str)
65-
})
59+
self.split('/').filter_map(|c| bytes_component_to_os_str(c.as_bytes()))
6660
}
6761
}
6862

6963
impl ToNormalPathComponents for &BString {
7064
fn to_normal_path_components(&self) -> impl Iterator<Item = Result<&OsStr, to_normal_path_components::Error>> {
71-
self.split(|b| *b == b'/').filter(|c| !c.is_empty()).map(|component| {
72-
gix_path::try_from_byte_slice(component.as_bstr())
73-
.map_err(|_| to_normal_path_components::Error::IllegalUtf8)
74-
.map(Path::as_os_str)
75-
})
65+
self.split(|b| *b == b'/').filter_map(bytes_component_to_os_str)
66+
}
67+
}
68+
69+
fn bytes_component_to_os_str(component: &[u8]) -> Option<Result<&OsStr, to_normal_path_components::Error>> {
70+
if component.is_empty() {
71+
return None;
7672
}
73+
gix_path::try_from_byte_slice(component.as_bstr())
74+
.map_err(|_| to_normal_path_components::Error::IllegalUtf8)
75+
.map(Path::as_os_str)
76+
.into()
7777
}
7878

7979
/// Access

0 commit comments

Comments
 (0)