Skip to main content

yazi_shared/path/
component.rs

1use std::path::PrefixComponent;
2
3use crate::{path::PathDynError, strand::Strand};
4
5#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
6pub enum Component<'a> {
7	Prefix(PrefixComponent<'a>),
8	RootDir,
9	CurDir,
10	ParentDir,
11	Normal(Strand<'a>),
12}
13
14impl<'a> Component<'a> {
15	pub fn as_normal(&self) -> Option<Strand<'a>> {
16		match self {
17			Self::Normal(s) => Some(*s),
18			_ => None,
19		}
20	}
21}
22
23impl<'a> From<std::path::Component<'a>> for Component<'a> {
24	fn from(value: std::path::Component<'a>) -> Self {
25		match value {
26			std::path::Component::Prefix(p) => Self::Prefix(p),
27			std::path::Component::RootDir => Self::RootDir,
28			std::path::Component::CurDir => Self::CurDir,
29			std::path::Component::ParentDir => Self::ParentDir,
30			std::path::Component::Normal(s) => Self::Normal(Strand::Os(s)),
31		}
32	}
33}
34
35impl<'a> From<typed_path::UnixComponent<'a>> for Component<'a> {
36	fn from(value: typed_path::UnixComponent<'a>) -> Self {
37		match value {
38			typed_path::UnixComponent::RootDir => Self::RootDir,
39			typed_path::UnixComponent::CurDir => Self::CurDir,
40			typed_path::UnixComponent::ParentDir => Self::ParentDir,
41			typed_path::UnixComponent::Normal(b) => Self::Normal(Strand::Bytes(b)),
42		}
43	}
44}
45
46impl<'a> TryFrom<Component<'a>> for std::path::Component<'a> {
47	type Error = PathDynError;
48
49	fn try_from(value: Component<'a>) -> Result<Self, Self::Error> {
50		Ok(match value {
51			Component::Prefix(p) => Self::Prefix(p),
52			Component::RootDir => Self::RootDir,
53			Component::CurDir => Self::CurDir,
54			Component::ParentDir => Self::ParentDir,
55			Component::Normal(s) => Self::Normal(s.as_os()?),
56		})
57	}
58}
59
60impl<'a> TryFrom<Component<'a>> for typed_path::UnixComponent<'a> {
61	type Error = PathDynError;
62
63	fn try_from(value: Component<'a>) -> Result<Self, Self::Error> {
64		Ok(match value {
65			Component::Prefix(_) => Err(PathDynError::AsUnix)?,
66			Component::RootDir => Self::RootDir,
67			Component::CurDir => Self::CurDir,
68			Component::ParentDir => Self::ParentDir,
69			Component::Normal(s) => Self::Normal(s.encoded_bytes()),
70		})
71	}
72}
73
74impl<'a> FromIterator<Component<'a>> for Result<std::path::PathBuf, PathDynError> {
75	fn from_iter<I: IntoIterator<Item = Component<'a>>>(iter: I) -> Self {
76		iter.into_iter().map(std::path::Component::try_from).collect()
77	}
78}
79
80impl<'a> FromIterator<Component<'a>> for Result<typed_path::UnixPathBuf, PathDynError> {
81	fn from_iter<I: IntoIterator<Item = Component<'a>>>(iter: I) -> Self {
82		iter.into_iter().map(typed_path::UnixComponent::try_from).collect()
83	}
84}