yazi_shared/path/
component.rs1use 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}