@@ -122,7 +122,7 @@ pub fn show(req: &mut dyn RequestExt) -> EndpointResult {
122122 let conn = req. db_read_only ( ) ?;
123123 let krate: Crate = Crate :: by_name ( name) . first ( & * conn) ?;
124124
125- let versions_publishers_and_audit_actions = if include. full {
125+ let versions_publishers_and_audit_actions = if include. versions {
126126 let mut versions_and_publishers: Vec < ( Version , Option < User > ) > = krate
127127 . all_versions ( )
128128 . left_outer_join ( users:: table)
@@ -150,7 +150,7 @@ pub fn show(req: &mut dyn RequestExt) -> EndpointResult {
150150 . as_ref ( )
151151 . map ( |vps| vps. iter ( ) . map ( |v| v. 0 . id ) . collect ( ) ) ;
152152
153- let kws = if include. full {
153+ let kws = if include. keywords {
154154 Some (
155155 CrateKeyword :: belonging_to ( & krate)
156156 . inner_join ( keywords:: table)
@@ -160,7 +160,7 @@ pub fn show(req: &mut dyn RequestExt) -> EndpointResult {
160160 } else {
161161 None
162162 } ;
163- let cats = if include. full {
163+ let cats = if include. categories {
164164 Some (
165165 CrateCategory :: belonging_to ( & krate)
166166 . inner_join ( categories:: table)
@@ -170,7 +170,7 @@ pub fn show(req: &mut dyn RequestExt) -> EndpointResult {
170170 } else {
171171 None
172172 } ;
173- let recent_downloads = if include. full {
173+ let recent_downloads = if include. downloads {
174174 RecentCrateDownloads :: belonging_to ( & krate)
175175 . select ( recent_crate_downloads:: downloads)
176176 . get_result ( & * conn)
@@ -179,7 +179,7 @@ pub fn show(req: &mut dyn RequestExt) -> EndpointResult {
179179 None
180180 } ;
181181
182- let badges = if include. full {
182+ let badges = if include. badges {
183183 Some (
184184 badges:: table
185185 . filter ( badges:: crate_id. eq ( krate. id ) )
@@ -188,7 +188,7 @@ pub fn show(req: &mut dyn RequestExt) -> EndpointResult {
188188 } else {
189189 None
190190 } ;
191- let top_versions = if include. full {
191+ let top_versions = if include. versions {
192192 Some ( krate. top_versions ( & conn) ?)
193193 } else {
194194 None
@@ -229,27 +229,63 @@ pub fn show(req: &mut dyn RequestExt) -> EndpointResult {
229229
230230#[ derive( Debug ) ]
231231struct ShowIncludeMode {
232- full : bool ,
232+ versions : bool ,
233+ keywords : bool ,
234+ categories : bool ,
235+ badges : bool ,
236+ downloads : bool ,
233237}
234238
235239impl Default for ShowIncludeMode {
236240 fn default ( ) -> Self {
237241 // 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+ }
239249 }
240250}
241251
252+ impl ShowIncludeMode {
253+ const INVALID_COMPONENT : & ' static str =
254+ "invalid component for ?mode= (expected 'versions', 'keywords', 'categories', 'badges', 'downloads', or 'full')" ;
255+ }
256+
242257impl FromStr for ShowIncludeMode {
243258 type Err = Box < dyn AppError > ;
244259
245260 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+ }
252287 }
288+ Ok ( mode)
253289 }
254290}
255291
0 commit comments