@@ -122,7 +122,7 @@ pub fn show(req: &mut dyn RequestExt) -> EndpointResult {
122
122
let conn = req. db_read_only ( ) ?;
123
123
let krate: Crate = Crate :: by_name ( name) . first ( & * conn) ?;
124
124
125
- let versions_publishers_and_audit_actions = if include. full {
125
+ let versions_publishers_and_audit_actions = if include. versions {
126
126
let mut versions_and_publishers: Vec < ( Version , Option < User > ) > = krate
127
127
. all_versions ( )
128
128
. left_outer_join ( users:: table)
@@ -150,7 +150,7 @@ pub fn show(req: &mut dyn RequestExt) -> EndpointResult {
150
150
. as_ref ( )
151
151
. map ( |vps| vps. iter ( ) . map ( |v| v. 0 . id ) . collect ( ) ) ;
152
152
153
- let kws = if include. full {
153
+ let kws = if include. keywords {
154
154
Some (
155
155
CrateKeyword :: belonging_to ( & krate)
156
156
. inner_join ( keywords:: table)
@@ -160,7 +160,7 @@ pub fn show(req: &mut dyn RequestExt) -> EndpointResult {
160
160
} else {
161
161
None
162
162
} ;
163
- let cats = if include. full {
163
+ let cats = if include. categories {
164
164
Some (
165
165
CrateCategory :: belonging_to ( & krate)
166
166
. inner_join ( categories:: table)
@@ -170,7 +170,7 @@ pub fn show(req: &mut dyn RequestExt) -> EndpointResult {
170
170
} else {
171
171
None
172
172
} ;
173
- let recent_downloads = if include. full {
173
+ let recent_downloads = if include. downloads {
174
174
RecentCrateDownloads :: belonging_to ( & krate)
175
175
. select ( recent_crate_downloads:: downloads)
176
176
. get_result ( & * conn)
@@ -179,7 +179,7 @@ pub fn show(req: &mut dyn RequestExt) -> EndpointResult {
179
179
None
180
180
} ;
181
181
182
- let badges = if include. full {
182
+ let badges = if include. badges {
183
183
Some (
184
184
badges:: table
185
185
. filter ( badges:: crate_id. eq ( krate. id ) )
@@ -188,7 +188,7 @@ pub fn show(req: &mut dyn RequestExt) -> EndpointResult {
188
188
} else {
189
189
None
190
190
} ;
191
- let top_versions = if include. full {
191
+ let top_versions = if include. versions {
192
192
Some ( krate. top_versions ( & conn) ?)
193
193
} else {
194
194
None
@@ -229,27 +229,63 @@ pub fn show(req: &mut dyn RequestExt) -> EndpointResult {
229
229
230
230
#[ derive( Debug ) ]
231
231
struct ShowIncludeMode {
232
- full : bool ,
232
+ versions : bool ,
233
+ keywords : bool ,
234
+ categories : bool ,
235
+ badges : bool ,
236
+ downloads : bool ,
233
237
}
234
238
235
239
impl Default for ShowIncludeMode {
236
240
fn default ( ) -> Self {
237
241
// Send everything for legacy clients that expect the full response
238
- Self { full : true }
242
+ Self {
243
+ versions : true ,
244
+ keywords : true ,
245
+ categories : true ,
246
+ badges : true ,
247
+ downloads : true ,
248
+ }
239
249
}
240
250
}
241
251
252
+ impl ShowIncludeMode {
253
+ const INVALID_COMPONENT : & ' static str =
254
+ "invalid component for ?mode= (expected 'versions', 'keywords', 'categories', 'badges', 'downloads', or 'full')" ;
255
+ }
256
+
242
257
impl FromStr for ShowIncludeMode {
243
258
type Err = Box < dyn AppError > ;
244
259
245
260
fn from_str ( s : & str ) -> Result < Self , Self :: Err > {
246
- match s {
247
- "" => Ok ( ShowIncludeMode { full : false } ) ,
248
- "full" => Ok ( ShowIncludeMode { full : true } ) ,
249
- _ => Err ( bad_request (
250
- "invalid value for ?mode= (expected '' or 'full')" ,
251
- ) ) ,
261
+ let mut mode = Self {
262
+ versions : false ,
263
+ keywords : false ,
264
+ categories : false ,
265
+ badges : false ,
266
+ downloads : false ,
267
+ } ;
268
+ for component in s. split ( ',' ) {
269
+ match component {
270
+ "" => { }
271
+ "full" => {
272
+ mode = Self {
273
+ versions : true ,
274
+ keywords : true ,
275
+ categories : true ,
276
+ badges : true ,
277
+ downloads : true ,
278
+ }
279
+ }
280
+ "versions" => mode. versions = true ,
281
+ "keywords" => mode. keywords = true ,
282
+ "categories" => mode. categories = true ,
283
+ "badges" => mode. badges = true ,
284
+ "downloads" => mode. downloads = true ,
285
+ _ => return Err ( bad_request ( Self :: INVALID_COMPONENT ) ) ,
286
+ }
252
287
}
288
+ Ok ( mode)
253
289
}
254
290
}
255
291
0 commit comments