Skip to main content

yazi_shared/loc/
cow.rs

1use std::{borrow::Cow, fmt::{self, Debug}};
2
3use crate::{loc::{Loc, LocAble, LocAbleImpl, LocBuf, LocBufAble}, path::{PathBufDyn, PathCow, PathDyn}};
4
5#[derive(Clone)]
6pub enum LocCow<'a, B = &'a std::path::Path, O = std::path::PathBuf>
7where
8	B: LocAble<'a, Owned = O>,
9	O: LocBufAble,
10{
11	Borrowed(Loc<'a, B>),
12	Owned(LocBuf<O>),
13}
14
15impl<'a, B, O> Debug for LocCow<'a, B, O>
16where
17	B: LocAble<'a, Owned = O>,
18	O: LocBufAble,
19	Loc<'a, B>: Debug,
20	LocBuf<O>: Debug,
21{
22	fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
23		match self {
24			Self::Borrowed(loc) => f.debug_tuple("Borrowed").field(loc).finish(),
25			Self::Owned(loc) => f.debug_tuple("Owned").field(loc).finish(),
26		}
27	}
28}
29
30impl<'a, B, O> Default for LocCow<'a, B, O>
31where
32	B: LocAble<'a, Owned = O> + LocAbleImpl<'a>,
33	O: LocBufAble,
34{
35	fn default() -> Self { Self::Borrowed(Default::default()) }
36}
37
38impl<'a, B, O> From<Loc<'a, B>> for LocCow<'a, B, O>
39where
40	B: LocAble<'a, Owned = O>,
41	O: LocBufAble,
42{
43	fn from(value: Loc<'a, B>) -> Self { Self::Borrowed(value) }
44}
45
46impl<'a, B, O> From<LocBuf<O>> for LocCow<'a, B, O>
47where
48	B: LocAble<'a, Owned = O>,
49	O: LocBufAble,
50{
51	fn from(value: LocBuf<O>) -> Self { Self::Owned(value) }
52}
53
54impl<'a, B, O> From<LocCow<'a, B, O>> for PathCow<'a>
55where
56	B: LocAble<'a, Owned = O> + Into<PathDyn<'a>>,
57	O: LocBufAble + Into<PathBufDyn>,
58{
59	fn from(value: LocCow<'a, B, O>) -> Self { value.into_path() }
60}
61
62impl<'a> LocCow<'a> {
63	pub fn as_loc(&self) -> Loc<'_> {
64		match self {
65			Self::Borrowed(loc) => *loc,
66			Self::Owned(loc) => loc.as_loc(),
67		}
68	}
69
70	pub fn into_inner(self) -> Cow<'a, std::path::Path> {
71		match self {
72			Self::Borrowed(loc) => Cow::Borrowed(loc.as_inner()),
73			Self::Owned(loc) => Cow::Owned(loc.into_inner()),
74		}
75	}
76}
77
78impl<'a> LocCow<'a, &'a typed_path::UnixPath, typed_path::UnixPathBuf> {
79	pub fn as_loc(&self) -> Loc<'_, &'_ typed_path::UnixPath> {
80		match self {
81			Self::Borrowed(loc) => *loc,
82			Self::Owned(loc) => loc.as_loc(),
83		}
84	}
85
86	pub fn into_inner(self) -> Cow<'a, typed_path::UnixPath> {
87		match self {
88			Self::Borrowed(loc) => Cow::Borrowed(loc.as_inner()),
89			Self::Owned(loc) => Cow::Owned(loc.into_inner()),
90		}
91	}
92}
93
94impl<'a, B, O> LocCow<'a, B, O>
95where
96	B: LocAble<'a, Owned = O> + LocAbleImpl<'a>,
97	O: LocBufAble,
98{
99	pub fn into_owned(self) -> LocBuf<O> {
100		match self {
101			Self::Borrowed(loc) => {
102				LocBuf { inner: loc.inner.to_path_buf(), uri: loc.uri, urn: loc.urn }
103			}
104			Self::Owned(loc) => loc,
105		}
106	}
107
108	pub fn is_borrowed(&self) -> bool { matches!(self, Self::Borrowed(_)) }
109
110	pub fn is_owned(&self) -> bool { !self.is_borrowed() }
111}
112
113impl<'a, B, O> LocCow<'a, B, O>
114where
115	B: LocAble<'a, Owned = O> + Into<PathDyn<'a>>,
116	O: LocBufAble + Into<PathBufDyn>,
117{
118	pub fn into_path(self) -> PathCow<'a> {
119		match self {
120			Self::Borrowed(loc) => PathCow::Borrowed(loc.inner.into()),
121			Self::Owned(loc) => PathCow::Owned(loc.inner.into()),
122		}
123	}
124}