Skip to main content

yazi_shared/url/
component.rs

1use 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
42// impl<'a> FromIterator<Component<'a>> for Result<UrlBuf> {
43// 	fn from_iter<I: IntoIterator<Item = Component<'a>>>(iter: I) -> Self {
44// 		let mut buf = PathBuf::new();
45// 		let mut scheme = None;
46// 		iter.into_iter().for_each(|c| match c {
47// 			Component::Scheme(s) => scheme = Some(s),
48// 			Component::Prefix(p) => buf.push(path::Component::Prefix(p)),
49// 			Component::RootDir => buf.push(path::Component::RootDir),
50// 			Component::CurDir => buf.push(path::Component::CurDir),
51// 			Component::ParentDir => buf.push(path::Component::ParentDir),
52// 			Component::Normal(s) => buf.push(path::Component::Normal(s)),
53// 		});
54
55// 		Ok(if let Some(s) = scheme {
56// 			UrlCow::try_from((s, PathCow::Owned(PathBufDyn::Os(buf))))?.into_owned()
57// 		} else {
58// 			buf.into()
59// 		})
60// 	}
61// }
62
63impl<'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}