Skip to content

Commit e36d08e

Browse files
committed
controllers::krate::metadata: Use json! macro to simplify JSON serialization code
1 parent 263c2d1 commit e36d08e

File tree

1 file changed

+31
-68
lines changed

1 file changed

+31
-68
lines changed

src/controllers/krate/metadata.rs

Lines changed: 31 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ pub fn summary(req: &mut dyn RequestExt) -> EndpointResult {
2525
use crate::schema::crates::dsl::*;
2626

2727
let conn = req.db_read_only()?;
28-
let num_crates = crates.count().get_result(&*conn)?;
29-
let num_downloads = metadata::table
28+
let num_crates: i64 = crates.count().get_result(&*conn)?;
29+
let num_downloads: i64 = metadata::table
3030
.select(metadata::total_downloads)
3131
.get_result(&*conn)?;
3232

@@ -89,34 +89,23 @@ pub fn summary(req: &mut dyn RequestExt) -> EndpointResult {
8989
.load(&*conn)?
9090
.into_iter()
9191
.map(Keyword::into)
92-
.collect();
92+
.collect::<Vec<EncodableKeyword>>();
9393

9494
let popular_categories = Category::toplevel(&conn, "crates", 10, 0)?
9595
.into_iter()
9696
.map(Category::into)
97-
.collect();
98-
99-
#[derive(Serialize)]
100-
struct R {
101-
num_downloads: i64,
102-
num_crates: i64,
103-
new_crates: Vec<EncodableCrate>,
104-
most_downloaded: Vec<EncodableCrate>,
105-
most_recently_downloaded: Vec<EncodableCrate>,
106-
just_updated: Vec<EncodableCrate>,
107-
popular_keywords: Vec<EncodableKeyword>,
108-
popular_categories: Vec<EncodableCategory>,
109-
}
110-
Ok(req.json(&R {
111-
num_downloads,
112-
num_crates,
113-
new_crates: encode_crates(new_crates)?,
114-
most_downloaded: encode_crates(most_downloaded)?,
115-
most_recently_downloaded: encode_crates(most_recently_downloaded)?,
116-
just_updated: encode_crates(just_updated)?,
117-
popular_keywords,
118-
popular_categories,
119-
}))
97+
.collect::<Vec<EncodableCategory>>();
98+
99+
Ok(req.json(&json!({
100+
"num_downloads": num_downloads,
101+
"num_crates": num_crates,
102+
"new_crates": encode_crates(new_crates)?,
103+
"most_downloaded": encode_crates(most_downloaded)?,
104+
"most_recently_downloaded": encode_crates(most_recently_downloaded)?,
105+
"just_updated": encode_crates(just_updated)?,
106+
"popular_keywords": popular_keywords,
107+
"popular_categories": popular_categories,
108+
})))
120109
}
121110

122111
/// Handles the `GET /crates/:crate_id` route.
@@ -167,16 +156,8 @@ pub fn show(req: &mut dyn RequestExt) -> EndpointResult {
167156
.load(&*conn)?;
168157
let top_versions = krate.top_versions(&conn)?;
169158

170-
#[derive(Serialize)]
171-
struct R {
172-
#[serde(rename = "crate")]
173-
krate: EncodableCrate,
174-
versions: Vec<EncodableVersion>,
175-
keywords: Vec<EncodableKeyword>,
176-
categories: Vec<EncodableCategory>,
177-
}
178-
Ok(req.json(&R {
179-
krate: EncodableCrate::from(
159+
Ok(req.json(&json!({
160+
"crate": EncodableCrate::from(
180161
krate.clone(),
181162
&top_versions,
182163
Some(ids),
@@ -186,13 +167,13 @@ pub fn show(req: &mut dyn RequestExt) -> EndpointResult {
186167
false,
187168
recent_downloads,
188169
),
189-
versions: versions_publishers_and_audit_actions
170+
"versions": versions_publishers_and_audit_actions
190171
.into_iter()
191172
.map(|(v, pb, aas)| EncodableVersion::from(v, &krate.name, pb, aas))
192-
.collect(),
193-
keywords: kws.into_iter().map(Keyword::into).collect(),
194-
categories: cats.into_iter().map(Category::into).collect(),
195-
}))
173+
.collect::<Vec<_>>(),
174+
"keywords": kws.into_iter().map(Keyword::into).collect::<Vec<EncodableKeyword>>(),
175+
"categories": cats.into_iter().map(Category::into).collect::<Vec<EncodableCategory>>(),
176+
})))
196177
}
197178

198179
/// Handles the `GET /crates/:crate_id/:version/readme` route.
@@ -207,11 +188,7 @@ pub fn readme(req: &mut dyn RequestExt) -> EndpointResult {
207188
.readme_location(crate_name, version);
208189

209190
if req.wants_json() {
210-
#[derive(Serialize)]
211-
struct R {
212-
url: String,
213-
}
214-
Ok(req.json(&R { url: redirect_url }))
191+
Ok(req.json(&json!({ "url": redirect_url })))
215192
} else {
216193
Ok(req.redirect(redirect_url))
217194
}
@@ -242,13 +219,9 @@ pub fn versions(req: &mut dyn RequestExt) -> EndpointResult {
242219
.into_iter()
243220
.zip(VersionOwnerAction::for_versions(&conn, &versions)?.into_iter())
244221
.map(|((v, pb), aas)| EncodableVersion::from(v, crate_name, pb, aas))
245-
.collect();
222+
.collect::<Vec<_>>();
246223

247-
#[derive(Serialize)]
248-
struct R {
249-
versions: Vec<EncodableVersion>,
250-
}
251-
Ok(req.json(&R { versions }))
224+
Ok(req.json(&json!({ "versions": versions })))
252225
}
253226

254227
/// Handles the `GET /crates/:crate_id/reverse_dependencies` route.
@@ -288,21 +261,11 @@ pub fn reverse_dependencies(req: &mut dyn RequestExt) -> EndpointResult {
288261
.map(|((version, krate_name, published_by), actions)| {
289262
EncodableVersion::from(version, &krate_name, published_by, actions)
290263
})
291-
.collect();
264+
.collect::<Vec<_>>();
292265

293-
#[derive(Serialize)]
294-
struct R {
295-
dependencies: Vec<EncodableDependency>,
296-
versions: Vec<EncodableVersion>,
297-
meta: Meta,
298-
}
299-
#[derive(Serialize)]
300-
struct Meta {
301-
total: i64,
302-
}
303-
Ok(req.json(&R {
304-
dependencies: rev_deps,
305-
versions,
306-
meta: Meta { total },
307-
}))
266+
Ok(req.json(&json!({
267+
"dependencies": rev_deps,
268+
"versions": versions,
269+
"meta": { "total": total },
270+
})))
308271
}

0 commit comments

Comments
 (0)