@@ -118,6 +118,21 @@ pub async fn find_crate(
118
118
. as_ref ( )
119
119
. map ( |vps| vps. iter ( ) . map ( |v| v. 0 . id ) . collect ( ) ) ;
120
120
121
+ let mut default_version_meta = None ;
122
+ if let Some ( default_version) = default_version. as_ref ( ) . filter ( |_| include. default_version ) {
123
+ // Find the default_version from composed versions to minimize round trips when possible.
124
+ if let Some ( versions) = versions_publishers_and_audit_actions. as_ref ( ) {
125
+ default_version_meta = versions
126
+ . iter ( )
127
+ . find ( |( version, _, _) | version. num . as_str ( ) == default_version)
128
+ . cloned ( ) ;
129
+ } else if let Ok ( version) = krate. find_version ( & mut conn, default_version) . await {
130
+ let published_by = version. published_by ( & mut conn) . await ?;
131
+ let actions = VersionOwnerAction :: by_version ( & mut conn, & version) . await ?;
132
+ default_version_meta = Some ( ( version, published_by, actions) ) ;
133
+ }
134
+ } ;
135
+
121
136
let kws = if include. keywords {
122
137
Some (
123
138
CrateKeyword :: belonging_to ( & krate)
@@ -174,6 +189,8 @@ pub async fn find_crate(
174
189
. map ( |( v, pb, aas) | EncodableVersion :: from ( v, & krate. name , pb, aas) )
175
190
. collect :: < Vec < _ > > ( )
176
191
} ) ;
192
+ let encodable_default_version =
193
+ default_version_meta. map ( |( v, pb, aas) | EncodableVersion :: from ( v, & krate. name , pb, aas) ) ;
177
194
178
195
let encodable_keywords = kws. map ( |kws| {
179
196
kws. into_iter ( )
@@ -192,6 +209,7 @@ pub async fn find_crate(
192
209
"versions" : encodable_versions,
193
210
"keywords" : encodable_keywords,
194
211
"categories" : encodable_cats,
212
+ "default_version" : encodable_default_version,
195
213
} ) )
196
214
}
197
215
@@ -202,6 +220,7 @@ struct ShowIncludeMode {
202
220
categories : bool ,
203
221
badges : bool ,
204
222
downloads : bool ,
223
+ default_version : bool ,
205
224
}
206
225
207
226
impl Default for ShowIncludeMode {
@@ -213,13 +232,14 @@ impl Default for ShowIncludeMode {
213
232
categories : true ,
214
233
badges : true ,
215
234
downloads : true ,
235
+ default_version : false ,
216
236
}
217
237
}
218
238
}
219
239
220
240
impl ShowIncludeMode {
221
241
const INVALID_COMPONENT : & ' static str =
222
- "invalid component for ?include= (expected 'versions', 'keywords', 'categories', 'badges', 'downloads', or 'full')" ;
242
+ "invalid component for ?include= (expected 'versions', 'keywords', 'categories', 'badges', 'downloads', 'default_version', or 'full')" ;
223
243
}
224
244
225
245
impl FromStr for ShowIncludeMode {
@@ -232,6 +252,7 @@ impl FromStr for ShowIncludeMode {
232
252
categories : false ,
233
253
badges : false ,
234
254
downloads : false ,
255
+ default_version : false ,
235
256
} ;
236
257
for component in s. split ( ',' ) {
237
258
match component {
@@ -243,13 +264,15 @@ impl FromStr for ShowIncludeMode {
243
264
categories : true ,
244
265
badges : true ,
245
266
downloads : true ,
267
+ default_version : true ,
246
268
}
247
269
}
248
270
"versions" => mode. versions = true ,
249
271
"keywords" => mode. keywords = true ,
250
272
"categories" => mode. categories = true ,
251
273
"badges" => mode. badges = true ,
252
274
"downloads" => mode. downloads = true ,
275
+ "default_version" => mode. default_version = true ,
253
276
_ => return Err ( bad_request ( Self :: INVALID_COMPONENT ) ) ,
254
277
}
255
278
}
0 commit comments