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}