1use std::borrow::Cow;
2
3use uv_normalize::PackageName;
4use uv_pep508::VerbatimUrl;
5use uv_redacted::policy::SerializationPolicy;
6
7use crate::error::Error;
8use crate::{
9 BuiltDist, CachedDirectUrlDist, CachedDist, CachedRegistryDist, DirectUrlBuiltDist,
10 DirectUrlSourceDist, DirectorySourceDist, Dist, DistributionId, GitDirectorySourceDist,
11 GitPathBuiltDist, GitPathSourceDist, InstalledDirectUrlDist, InstalledDist,
12 InstalledEggInfoDirectory, InstalledEggInfoFile, InstalledLegacyEditable,
13 InstalledRegistryDist, InstalledVersion, LocalDist, PackageId, PathBuiltDist, PathSourceDist,
14 RegistryBuiltWheel, RegistrySourceDist, ResourceId, SourceDist, VersionId, VersionOrUrlRef,
15};
16
17pub trait Name {
18 fn name(&self) -> &PackageName;
20}
21
22pub trait DistributionMetadata: Name {
25 fn version_or_url(&self) -> VersionOrUrlRef<'_>;
28
29 fn version_id(&self) -> VersionId {
35 match self.version_or_url() {
36 VersionOrUrlRef::Version(version) => {
37 VersionId::from_registry(self.name().clone(), version.clone())
38 }
39 VersionOrUrlRef::Url(url) => VersionId::from_url(url),
40 }
41 }
42
43 fn package_id(&self) -> PackageId {
50 match self.version_or_url() {
51 VersionOrUrlRef::Version(_) => PackageId::from_registry(self.name().clone()),
52 VersionOrUrlRef::Url(url) => PackageId::from_url(url.raw().clone()),
53 }
54 }
55}
56
57pub trait InstalledMetadata: Name {
59 fn installed_version(&self) -> InstalledVersion<'_>;
61}
62
63pub trait RemoteSource {
64 fn filename(&self) -> Result<Cow<'_, str>, Error>;
66
67 fn size(&self) -> Option<u64>;
69}
70
71pub trait Identifier {
72 fn distribution_id(&self) -> DistributionId;
86
87 fn resource_id(&self) -> ResourceId;
94}
95
96pub trait Verbatim {
97 fn verbatim(&self) -> Cow<'_, str>;
99}
100
101impl<P: SerializationPolicy> Verbatim for VerbatimUrl<P> {
102 fn verbatim(&self) -> Cow<'_, str> {
103 if let Some(given) = self.given() {
104 Cow::Borrowed(given)
105 } else {
106 Cow::Owned(self.to_string())
107 }
108 }
109}
110
111impl<T: DistributionMetadata> Verbatim for T {
112 fn verbatim(&self) -> Cow<'_, str> {
113 Cow::Owned(format!(
114 "{}{}",
115 self.name(),
116 self.version_or_url().verbatim()
117 ))
118 }
119}
120
121impl std::fmt::Display for LocalDist {
123 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
124 write!(f, "{}{}", self.name(), self.installed_version())
125 }
126}
127
128impl std::fmt::Display for BuiltDist {
129 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
130 write!(f, "{}{}", self.name(), self.version_or_url())
131 }
132}
133
134impl std::fmt::Display for CachedDist {
135 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
136 write!(f, "{}{}", self.name(), self.installed_version())
137 }
138}
139
140impl std::fmt::Display for CachedDirectUrlDist {
141 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
142 write!(f, "{}{}", self.name(), self.installed_version())
143 }
144}
145
146impl std::fmt::Display for CachedRegistryDist {
147 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
148 write!(f, "{}{}", self.name(), self.installed_version())
149 }
150}
151
152impl std::fmt::Display for DirectUrlBuiltDist {
153 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
154 write!(f, "{}{}", self.name(), self.version_or_url())
155 }
156}
157
158impl std::fmt::Display for DirectUrlSourceDist {
159 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
160 write!(f, "{}{}", self.name(), self.version_or_url())
161 }
162}
163
164impl std::fmt::Display for Dist {
165 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
166 write!(f, "{}{}", self.name(), self.version_or_url())
167 }
168}
169
170impl std::fmt::Display for GitPathBuiltDist {
171 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
172 write!(f, "{}{}", self.name(), self.version_or_url())
173 }
174}
175
176impl std::fmt::Display for GitPathSourceDist {
177 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
178 write!(f, "{}{}", self.name(), self.version_or_url())
179 }
180}
181
182impl std::fmt::Display for GitDirectorySourceDist {
183 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
184 write!(f, "{}{}", self.name(), self.version_or_url())
185 }
186}
187
188impl std::fmt::Display for InstalledDist {
189 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
190 write!(f, "{}{}", self.name(), self.installed_version())
191 }
192}
193
194impl std::fmt::Display for InstalledDirectUrlDist {
195 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
196 write!(f, "{}{}", self.name(), self.installed_version())
197 }
198}
199
200impl std::fmt::Display for InstalledRegistryDist {
201 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
202 write!(f, "{}{}", self.name(), self.installed_version())
203 }
204}
205
206impl std::fmt::Display for InstalledEggInfoFile {
207 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
208 write!(f, "{}{}", self.name(), self.installed_version())
209 }
210}
211
212impl std::fmt::Display for InstalledEggInfoDirectory {
213 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
214 write!(f, "{}{}", self.name(), self.installed_version())
215 }
216}
217
218impl std::fmt::Display for InstalledLegacyEditable {
219 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
220 write!(f, "{}{}", self.name(), self.installed_version())
221 }
222}
223
224impl std::fmt::Display for PathBuiltDist {
225 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
226 write!(f, "{}{}", self.name(), self.version_or_url())
227 }
228}
229
230impl std::fmt::Display for PathSourceDist {
231 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
232 write!(f, "{}{}", self.name(), self.version_or_url())
233 }
234}
235
236impl std::fmt::Display for DirectorySourceDist {
237 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
238 write!(f, "{}{}", self.name(), self.version_or_url())
239 }
240}
241
242impl std::fmt::Display for RegistryBuiltWheel {
243 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
244 write!(f, "{}{}", self.name(), self.version_or_url())
245 }
246}
247
248impl std::fmt::Display for RegistrySourceDist {
249 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
250 write!(f, "{}{}", self.name(), self.version_or_url())
251 }
252}
253
254impl std::fmt::Display for SourceDist {
255 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
256 write!(f, "{}{}", self.name(), self.version_or_url())
257 }
258}