yazi_shared/url/
component.rs1use std::path::PrefixComponent;
2
3use anyhow::Result;
4
5use crate::{path::{self, PathDynError}, scheme::SchemeRef, strand::Strand};
6
7#[derive(Clone, Copy, Debug, PartialEq)]
8pub enum Component<'a> {
9 Scheme(SchemeRef<'a>),
10 Prefix(PrefixComponent<'a>),
11 RootDir,
12 CurDir,
13 ParentDir,
14 Normal(Strand<'a>),
15}
16
17impl<'a> From<path::Component<'a>> for Component<'a> {
18 fn from(value: path::Component<'a>) -> Self {
19 match value {
20 path::Component::Prefix(p) => Self::Prefix(p),
21 path::Component::RootDir => Self::RootDir,
22 path::Component::CurDir => Self::CurDir,
23 path::Component::ParentDir => Self::ParentDir,
24 path::Component::Normal(s) => Self::Normal(s),
25 }
26 }
27}
28
29impl<'a> Component<'a> {
30 pub fn downgrade(self) -> Option<path::Component<'a>> {
31 Some(match self {
32 Self::Scheme(_) => None?,
33 Self::Prefix(p) => path::Component::Prefix(p),
34 Self::RootDir => path::Component::RootDir,
35 Self::CurDir => path::Component::CurDir,
36 Self::ParentDir => path::Component::ParentDir,
37 Self::Normal(s) => path::Component::Normal(s),
38 })
39 }
40}
41
42impl<'a> FromIterator<Component<'a>> for Result<std::path::PathBuf, PathDynError> {
64 fn from_iter<I: IntoIterator<Item = Component<'a>>>(iter: I) -> Self {
65 iter.into_iter().filter_map(|c| c.downgrade()).map(std::path::Component::try_from).collect()
66 }
67}
68
69impl<'a> FromIterator<Component<'a>> for Result<typed_path::UnixPathBuf, PathDynError> {
70 fn from_iter<I: IntoIterator<Item = Component<'a>>>(iter: I) -> Self {
71 iter
72 .into_iter()
73 .filter_map(|c| c.downgrade())
74 .map(typed_path::UnixComponent::try_from)
75 .collect()
76 }
77}