Skip to content

Commit f06e331

Browse files
KixironJoshua Nelson
authored and
Joshua Nelson
committed
Converted convert_dependencies into a map
1 parent b7afc73 commit f06e331

File tree

5 files changed

+134
-129
lines changed

5 files changed

+134
-129
lines changed

src/db/add_package.rs

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -185,17 +185,16 @@ fn initialize_package_in_database(conn: &Connection, pkg: &MetadataPackage) -> R
185185

186186
/// Convert dependencies into Vec<(String, String, String)>
187187
fn convert_dependencies(pkg: &MetadataPackage) -> Vec<(String, String, String)> {
188-
let mut dependencies: Vec<(String, String, String)> =
189-
Vec::with_capacity(pkg.dependencies.len());
188+
pkg.dependencies
189+
.iter()
190+
.map(|dependency| {
191+
let name = dependency.name.clone();
192+
let version = dependency.req.clone();
193+
let kind = dependency.kind.clone().unwrap_or_else(|| "normal".into());
190194

191-
for dependency in &pkg.dependencies {
192-
let name = dependency.name.clone();
193-
let version = dependency.req.clone();
194-
let kind = dependency.kind.clone().unwrap_or_else(|| "normal".into());
195-
dependencies.push((name, version, kind.to_string()));
196-
}
197-
198-
dependencies
195+
(name, version, kind)
196+
})
197+
.collect()
199198
}
200199

201200
/// Reads readme if there is any read defined in Cargo.toml of a Package

src/index/api.rs

Lines changed: 35 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -116,47 +116,43 @@ fn get_owners(pkg: &MetadataPackage) -> Result<Vec<CrateOwner>> {
116116
res.read_to_string(&mut body).unwrap();
117117
let json: Value = serde_json::from_str(&body[..])?;
118118

119-
let mut result = Vec::new();
120-
if let Some(owners) = json
119+
let owners = json
121120
.as_object()
122121
.and_then(|j| j.get("users"))
123-
.and_then(|j| j.as_array())
124-
{
125-
for owner in owners {
126-
// FIXME: I know there is a better way to do this
127-
let avatar = owner
128-
.as_object()
129-
.and_then(|o| o.get("avatar"))
130-
.and_then(|o| o.as_str())
131-
.unwrap_or("");
132-
let email = owner
133-
.as_object()
134-
.and_then(|o| o.get("email"))
135-
.and_then(|o| o.as_str())
136-
.unwrap_or("");
137-
let login = owner
138-
.as_object()
139-
.and_then(|o| o.get("login"))
140-
.and_then(|o| o.as_str())
141-
.unwrap_or("");
142-
let name = owner
143-
.as_object()
144-
.and_then(|o| o.get("name"))
145-
.and_then(|o| o.as_str())
146-
.unwrap_or("");
147-
148-
if login.is_empty() {
149-
continue;
150-
}
151-
152-
result.push(CrateOwner {
153-
avatar: avatar.to_string(),
154-
email: email.to_string(),
155-
login: login.to_string(),
156-
name: name.to_string(),
157-
});
158-
}
159-
}
122+
.and_then(|j| j.as_array());
123+
124+
let result = if let Some(owners) = owners {
125+
owners
126+
.iter()
127+
.filter_map(|owner| {
128+
fn extract<'a>(owner: &'a Value, field: &str) -> &'a str {
129+
owner
130+
.as_object()
131+
.and_then(|o| o.get(field))
132+
.and_then(|o| o.as_str())
133+
.unwrap_or_default()
134+
}
135+
136+
let avatar = extract(owner, "avatar");
137+
let email = extract(owner, "email");
138+
let login = extract(owner, "login");
139+
let name = extract(owner, "name");
140+
141+
if login.is_empty() {
142+
return None;
143+
}
144+
145+
Some(CrateOwner {
146+
avatar: avatar.to_string(),
147+
email: email.to_string(),
148+
login: login.to_string(),
149+
name: name.to_string(),
150+
})
151+
})
152+
.collect()
153+
} else {
154+
Vec::new()
155+
};
160156

161157
Ok(result)
162158
}

src/web/builds.rs

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -90,28 +90,29 @@ pub fn build_list_handler(req: &mut Request) -> IronResult<Response> {
9090
&[&name, &version]
9191
));
9292

93-
let mut build_list: Vec<Build> = Vec::with_capacity(query.len());
9493
let mut build_details = None;
95-
9694
// FIXME: getting builds.output may cause performance issues when release have tons of builds
97-
for row in query.iter() {
98-
let id: i32 = row.get(5);
99-
100-
let build = Build {
101-
id,
102-
rustc_version: row.get(6),
103-
cratesfyi_version: row.get(7),
104-
build_status: row.get(8),
105-
build_time: row.get(9),
106-
output: row.get(10),
107-
};
108-
109-
if id == req_build_id {
110-
build_details = Some(build.clone());
111-
}
112-
113-
build_list.push(build);
114-
}
95+
let mut build_list = query
96+
.into_iter()
97+
.map(|row| {
98+
let id: i32 = row.get(5);
99+
100+
let build = Build {
101+
id,
102+
rustc_version: row.get(6),
103+
cratesfyi_version: row.get(7),
104+
build_status: row.get(8),
105+
build_time: row.get(9),
106+
output: row.get(10),
107+
};
108+
109+
if id == req_build_id {
110+
build_details = Some(build.clone());
111+
}
112+
113+
build
114+
})
115+
.collect::<Vec<Build>>();
115116

116117
if req.url.path().join("/").ends_with(".json") {
117118
use iron::headers::{

src/web/releases.rs

Lines changed: 61 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -142,22 +142,18 @@ pub(crate) fn get_releases(conn: &Connection, page: i64, limit: i64, order: Orde
142142
};
143143
let query = conn.query(&query, &[&limit, &offset]).unwrap();
144144

145-
let mut packages = Vec::with_capacity(query.len());
146-
for row in query.iter() {
147-
let package = Release {
145+
query
146+
.into_iter()
147+
.map(|row| Release {
148148
name: row.get(0),
149149
version: row.get(1),
150150
description: row.get(2),
151151
target_name: row.get(3),
152152
release_time: row.get(4),
153153
rustdoc_status: row.get(5),
154154
stars: row.get(6),
155-
};
156-
157-
packages.push(package);
158-
}
159-
160-
packages
155+
})
156+
.collect()
161157
}
162158

163159
fn get_releases_by_author(
@@ -185,24 +181,27 @@ fn get_releases_by_author(
185181
LIMIT $2 OFFSET $3";
186182
let query = conn.query(&query, &[&author, &limit, &offset]).unwrap();
187183

188-
let mut author_name = String::new();
189-
let mut packages = Vec::with_capacity(query.len());
190-
for row in query.iter() {
191-
let package = Release {
192-
name: row.get(0),
193-
version: row.get(1),
194-
description: row.get(2),
195-
target_name: row.get(3),
196-
release_time: row.get(4),
197-
rustdoc_status: row.get(5),
198-
stars: row.get(6),
199-
};
184+
let mut author_name = None;
185+
let packages = query
186+
.into_iter()
187+
.map(|row| {
188+
if author_name.is_none() {
189+
author_name = Some(row.get(7));
190+
}
200191

201-
author_name = row.get(7);
202-
packages.push(package);
203-
}
192+
Release {
193+
name: row.get(0),
194+
version: row.get(1),
195+
description: row.get(2),
196+
target_name: row.get(3),
197+
release_time: row.get(4),
198+
rustdoc_status: row.get(5),
199+
stars: row.get(6),
200+
}
201+
})
202+
.collect();
204203

205-
(author_name, packages)
204+
(author_name.unwrap_or_default(), packages)
206205
}
207206

208207
fn get_releases_by_owner(
@@ -231,28 +230,31 @@ fn get_releases_by_owner(
231230
LIMIT $2 OFFSET $3";
232231
let query = conn.query(&query, &[&author, &limit, &offset]).unwrap();
233232

234-
let mut author_name = String::new();
235-
let mut packages = Vec::with_capacity(query.len());
236-
for row in query.iter() {
237-
let package = Release {
238-
name: row.get(0),
239-
version: row.get(1),
240-
description: row.get(2),
241-
target_name: row.get(3),
242-
release_time: row.get(4),
243-
rustdoc_status: row.get(5),
244-
stars: row.get(6),
245-
};
233+
let mut author_name = None;
234+
let packages = query
235+
.into_iter()
236+
.map(|row| {
237+
if author_name.is_none() {
238+
author_name = Some(if !row.get::<usize, String>(7).is_empty() {
239+
row.get(7)
240+
} else {
241+
row.get(8)
242+
});
243+
}
246244

247-
author_name = if !row.get::<usize, String>(7).is_empty() {
248-
row.get(7)
249-
} else {
250-
row.get(8)
251-
};
252-
packages.push(package);
253-
}
245+
Release {
246+
name: row.get(0),
247+
version: row.get(1),
248+
description: row.get(2),
249+
target_name: row.get(3),
250+
release_time: row.get(4),
251+
rustdoc_status: row.get(5),
252+
stars: row.get(6),
253+
}
254+
})
255+
.collect();
254256

255-
(author_name, packages)
257+
(author_name.unwrap_or_default(), packages)
256258
}
257259

258260
/// Get the search results for a crate search query
@@ -650,17 +652,20 @@ pub fn build_queue_handler(req: &mut Request) -> IronResult<Response> {
650652
)
651653
.unwrap();
652654

653-
let mut crates: Vec<(String, String, i32)> = Vec::with_capacity(query.len());
654-
for krate in query.iter() {
655-
crates.push((
656-
krate.get("name"),
657-
krate.get("version"),
658-
// The priority here is inverted: in the database if a crate has a higher priority it
659-
// will be built after everything else, which is counter-intuitive for people not
660-
// familiar with docs.rs's inner workings.
661-
-krate.get::<_, i32>("priority"),
662-
));
663-
}
655+
let crates = query
656+
.into_iter()
657+
.map(|krate| {
658+
(
659+
krate.get("name"),
660+
krate.get("version"),
661+
// The priority here is inverted: in the database if a crate has a higher priority it
662+
// will be built after everything else, which is counter-intuitive for people not
663+
// familiar with docs.rs's inner workings.
664+
-krate.get::<_, i32>("priority"),
665+
)
666+
})
667+
.collect::<Vec<(String, String, i32)>>();
668+
664669
let is_empty = crates.is_empty();
665670
Page::new(crates)
666671
.title("Build queue")

src/web/sitemap.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,14 @@ pub fn sitemap_handler(req: &mut Request) -> IronResult<Response> {
1919
)
2020
.unwrap();
2121

22-
let mut releases: Vec<(String, String)> = Vec::with_capacity(query.len());
23-
for row in query.iter() {
24-
releases.push((row.get(0), format!("{}", time::at(row.get(1)).rfc3339())));
25-
}
22+
let releases = query.into_iter()
23+
.map(|row| {
24+
let time = format!("{}", time::at(row.get(1)).rfc3339());
25+
26+
(row.get(0), time)
27+
})
28+
.collect::<Vec<(String, String)>>();
29+
2630
let mut resp = ctry!(Page::new(releases).to_resp("sitemap"));
2731
resp.headers
2832
.set(ContentType("application/xml".parse().unwrap()));

0 commit comments

Comments
 (0)