Skip to content

Commit 6c1e332

Browse files
committed
Get rid of most of unwrap and run rustfmt on web
1 parent 660ddd6 commit 6c1e332

File tree

7 files changed

+151
-140
lines changed

7 files changed

+151
-140
lines changed

src/web/builds.rs

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -59,23 +59,18 @@ impl ToJson for BuildsPage {
5959

6060
pub fn build_list_handler(req: &mut Request) -> IronResult<Response> {
6161

62-
let name = req.extensions.get::<Router>().unwrap().find("name").unwrap();
63-
let version = req.extensions.get::<Router>().unwrap().find("version").unwrap();
64-
let req_build_id: i32 = req.extensions
65-
.get::<Router>()
66-
.unwrap()
67-
.find("id")
68-
.unwrap_or("0")
69-
.parse()
70-
.unwrap_or(0);
71-
72-
let conn = req.extensions.get::<Pool>().unwrap();
62+
let router = extension!(req, Router);
63+
let name = cexpect!(router.find("name"));
64+
let version = cexpect!(router.find("version"));
65+
let req_build_id: i32 = router.find("id").unwrap_or("0").parse().unwrap_or(0);
66+
67+
let conn = extension!(req, Pool);
7368

7469
let mut build_list: Vec<Build> = Vec::new();
7570
let mut build_details = None;
7671

7772
// FIXME: getting builds.output may cause performance issues when release have tons of builds
78-
for row in &conn.query("SELECT crates.name, \
73+
for row in &ctry!(conn.query("SELECT crates.name, \
7974
releases.version, \
8075
releases.description, \
8176
releases.rustdoc_status, \
@@ -90,8 +85,7 @@ pub fn build_list_handler(req: &mut Request) -> IronResult<Response> {
9085
INNER JOIN releases ON releases.id = builds.rid \
9186
INNER JOIN crates ON releases.crate_id = crates.id \
9287
WHERE crates.name = $1 AND releases.version = $2",
93-
&[&name, &version])
94-
.unwrap() {
88+
&[&name, &version])) {
9589

9690
let id: i32 = row.get(5);
9791

src/web/crate_details.rs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -187,15 +187,19 @@ impl CrateDetails {
187187
for row in &conn.query("SELECT name, slug
188188
FROM authors
189189
INNER JOIN author_rels ON author_rels.aid = authors.id
190-
WHERE rid = $1", &[&release_id]).unwrap() {
190+
WHERE rid = $1",
191+
&[&release_id])
192+
.unwrap() {
191193
crate_details.authors.push((row.get(0), row.get(1)));
192194
}
193195

194196
// get owners
195197
for row in &conn.query("SELECT login, avatar
196198
FROM owners
197199
INNER JOIN owner_rels ON owner_rels.oid = owners.id
198-
WHERE cid = $1", &[&crate_id]).unwrap() {
200+
WHERE cid = $1",
201+
&[&crate_id])
202+
.unwrap() {
199203
crate_details.owners.push((row.get(0), row.get(1)));
200204
}
201205

@@ -206,11 +210,12 @@ impl CrateDetails {
206210

207211

208212
pub fn crate_details_handler(req: &mut Request) -> IronResult<Response> {
213+
let router = extension!(req, Router);
209214
// this handler must always called with a crate name
210-
let name = req.extensions.get::<Router>().unwrap().find("name").unwrap();
211-
let req_version = req.extensions.get::<Router>().unwrap().find("version");
215+
let name = cexpect!(router.find("name"));
216+
let req_version = router.find("version");
212217

213-
let conn = req.extensions.get::<Pool>().unwrap();
218+
let conn = extension!(req, Pool);
214219

215220
match_version(&conn, &name, req_version)
216221
.and_then(|version| CrateDetails::new(&conn, &name, &version))

src/web/file.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ impl File {
2222

2323
let rows = conn.query("SELECT path, mime, date_added, date_updated, content FROM files \
2424
WHERE path = $1",
25-
&[&path])
26-
.unwrap();
25+
&[&path])
26+
.unwrap();
2727

2828
if rows.len() == 0 {
2929
None
@@ -46,7 +46,7 @@ impl File {
4646

4747
let mut response = Response::with((status::Ok, self.content));
4848
let cache = vec![CacheDirective::Public,
49-
CacheDirective::MaxAge(super::STATIC_FILE_CACHE_DURATION as u32)];
49+
CacheDirective::MaxAge(super::STATIC_FILE_CACHE_DURATION as u32)];
5050
response.headers.set(ContentType(self.mime.parse().unwrap()));
5151
response.headers.set(CacheControl(cache));
5252
response.headers.set(LastModified(HttpDate(time::at(self.date_updated))));
@@ -71,7 +71,7 @@ impl Handler for DatabaseFileHandler {
7171

7272
let path = req.url.path.clone().join("/");
7373

74-
let conn = req.extensions.get::<Pool>().unwrap();
74+
let conn = extension!(req, Pool);
7575
if let Some(file) = File::from_path(&conn, &path) {
7676
Ok(file.serve())
7777
} else {

src/web/mod.rs

Lines changed: 50 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,42 @@
11
//! Web interface of cratesfyi
22
33

4+
pub mod page;
5+
6+
/// ctry! (cratesfyitry) is extremely similar to try! and itry!
7+
/// except it returns an error page response instead of plain Err.
8+
macro_rules! ctry {
9+
($result:expr) => (match $result {
10+
Ok(v) => v,
11+
Err(e) => {
12+
return super::page::Page::new(format!("{:?}", e)).title("An error has occured")
13+
.set_status(::iron::status::BadRequest).to_resp("resp");
14+
}
15+
})
16+
}
17+
18+
/// cexpect will check an option and if it's not Some
19+
/// it will return an error page response
20+
macro_rules! cexpect {
21+
($option:expr) => (match $option {
22+
Some(v) => v,
23+
None => {
24+
return super::page::Page::new("Resource not found".to_owned())
25+
.title("An error has occured")
26+
.set_status(::iron::status::BadRequest).to_resp("resp");
27+
}
28+
})
29+
}
30+
31+
/// Gets an extension from Request
32+
macro_rules! extension {
33+
($req:expr, $ext:ty) => (
34+
cexpect!($req.extensions.get::<$ext>())
35+
)
36+
}
37+
438
mod rustdoc;
539
mod releases;
6-
mod page;
740
mod crate_details;
841
mod source;
942
mod pool;
@@ -27,7 +60,6 @@ use rustc_serialize::json::{Json, ToJson};
2760
use std::collections::BTreeMap;
2861

2962

30-
3163
/// Duration of static files for staticfile and DatabaseFileHandler (in seconds)
3264
const STATIC_FILE_CACHE_DURATION: u64 = 60 * 60 * 24 * 30 * 12; // 12 months
3365
const STYLE_CSS: &'static str = include_str!(concat!(env!("OUT_DIR"), "/style.css"));
@@ -114,21 +146,21 @@ impl Handler for CratesfyiHandler {
114146
// if router fails try to serve files from database first
115147
self.database_file_handler.handle(req).or(Err(e))
116148
})
117-
.or_else(|e| {
118-
// and then try static handler. if all of them fails, return 404
119-
self.static_handler.handle(req).or(Err(e))
120-
})
121-
.or_else(|e| {
122-
debug!("{}", e.description());
123-
let err = if let Some(err) = e.error.downcast::<error::Nope>() {
124-
*err
125-
} else if e.error.downcast::<NoRoute>().is_some() {
126-
error::Nope::ResourceNotFound
127-
} else {
128-
panic!("all cratesfyi errors should be of type Nope");
129-
};
130-
Self::chain(err).handle(req)
131-
})
149+
.or_else(|e| {
150+
// and then try static handler. if all of them fails, return 404
151+
self.static_handler.handle(req).or(Err(e))
152+
})
153+
.or_else(|e| {
154+
debug!("{}", e.description());
155+
let err = if let Some(err) = e.error.downcast::<error::Nope>() {
156+
*err
157+
} else if e.error.downcast::<NoRoute>().is_some() {
158+
error::Nope::ResourceNotFound
159+
} else {
160+
panic!("all cratesfyi errors should be of type Nope");
161+
};
162+
Self::chain(err).handle(req)
163+
})
132164
}
133165
}
134166

@@ -303,7 +335,7 @@ impl MetaData {
303335
FROM releases
304336
INNER JOIN crates ON crates.id = releases.crate_id
305337
WHERE crates.name = $1 AND releases.version = $2",
306-
&[&name, &version]).unwrap() {
338+
&[&name, &version]).unwrap() {
307339

308340
return Some(MetaData {
309341
name: row.get(0),

src/web/releases.rs

Lines changed: 37 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ fn get_search_results(conn: &Connection,
272272

273273

274274
pub fn home_page(req: &mut Request) -> IronResult<Response> {
275-
let conn = req.extensions.get::<Pool>().unwrap();
275+
let conn = extension!(req, Pool);
276276
let packages = get_releases(conn, 1, RELEASES_IN_HOME, Order::ReleaseTime);
277277
Page::new(packages)
278278
.set_true("show_search_form")
@@ -283,15 +283,9 @@ pub fn home_page(req: &mut Request) -> IronResult<Response> {
283283

284284
pub fn releases_handler(req: &mut Request) -> IronResult<Response> {
285285
// page number of releases
286-
let page_number: i64 = req.extensions
287-
.get::<Router>()
288-
.unwrap()
289-
.find("page")
290-
.unwrap_or("1")
291-
.parse()
292-
.unwrap_or(1);
293-
294-
let conn = req.extensions.get::<Pool>().unwrap();
286+
let page_number: i64 = extension!(req, Router).find("page").unwrap_or("1").parse().unwrap_or(1);
287+
288+
let conn = extension!(req, Pool);
295289
let packages = get_releases(conn, page_number, RELEASES_IN_RELEASES, Order::ReleaseTime);
296290

297291
if packages.is_empty() {
@@ -320,15 +314,9 @@ pub fn releases_handler(req: &mut Request) -> IronResult<Response> {
320314
// TODO: This function is almost identical to previous one
321315
pub fn stars_handler(req: &mut Request) -> IronResult<Response> {
322316
// page number of releases
323-
let page_number: i64 = req.extensions
324-
.get::<Router>()
325-
.unwrap()
326-
.find("page")
327-
.unwrap_or("1")
328-
.parse()
329-
.unwrap_or(1);
330-
331-
let conn = req.extensions.get::<Pool>().unwrap();
317+
let page_number: i64 = extension!(req, Router).find("page").unwrap_or("1").parse().unwrap_or(1);
318+
319+
let conn = extension!(req, Pool);
332320
let packages = get_releases(conn, page_number, RELEASES_IN_RELEASES, Order::GithubStars);
333321

334322
if packages.is_empty() {
@@ -356,25 +344,20 @@ pub fn stars_handler(req: &mut Request) -> IronResult<Response> {
356344

357345

358346
pub fn author_handler(req: &mut Request) -> IronResult<Response> {
347+
let router = extension!(req, Router);
359348
// page number of releases
360-
let page_number: i64 = req.extensions
361-
.get::<Router>()
362-
.unwrap()
363-
.find("page")
364-
.unwrap_or("1")
365-
.parse()
366-
.unwrap_or(1);
367-
368-
let conn = req.extensions.get::<Pool>().unwrap();
369-
let author = try!(req.extensions
370-
.get::<Router>()
371-
.unwrap()
372-
.find("author")
349+
let page_number: i64 = router.find("page").unwrap_or("1").parse().unwrap_or(1);
350+
351+
let conn = extension!(req, Pool);
352+
let author = ctry!(router.find("author")
373353
.ok_or(IronError::new(Nope::CrateNotFound, status::NotFound)));
374354

375355
let (author_name, packages) = if author.starts_with("@") {
376356
let mut author = author.clone().split("@");
377-
get_releases_by_owner(conn, page_number, RELEASES_IN_RELEASES, author.nth(1).unwrap())
357+
get_releases_by_owner(conn,
358+
page_number,
359+
RELEASES_IN_RELEASES,
360+
cexpect!(author.nth(1)))
378361
} else {
379362
get_releases_by_author(conn, page_number, RELEASES_IN_RELEASES, author)
380363
};
@@ -405,10 +388,10 @@ pub fn author_handler(req: &mut Request) -> IronResult<Response> {
405388
pub fn search_handler(req: &mut Request) -> IronResult<Response> {
406389
use params::{Params, Value};
407390

408-
let params = req.get::<Params>().unwrap();
391+
let params = ctry!(req.get::<Params>());
409392
let query = params.find(&["query"]);
410393

411-
let conn = req.extensions.get::<Pool>().unwrap();
394+
let conn = extension!(req, Pool);
412395
if let Some(&Value::String(ref query)) = query {
413396

414397
// check if I am feeling lucky button pressed and redirect user to crate page
@@ -421,29 +404,29 @@ pub fn search_handler(req: &mut Request) -> IronResult<Response> {
421404

422405
// redirect to a random crate if query is empty
423406
if query.is_empty() {
424-
let rows = conn.query("SELECT crates.name, \
407+
let rows = ctry!(conn.query("SELECT crates.name, \
425408
releases.version, \
426409
releases.target_name \
427410
FROM crates \
428411
INNER JOIN releases
429412
ON crates.latest_version_id = releases.id \
430413
WHERE github_stars >= 100 AND rustdoc_status = true \
431-
OFFSET FLOOR(RANDOM() * 280) LIMIT 1", &[]).unwrap();
432-
// ~~~~~~^
433-
// FIXME: This is a fast query but using a constant
434-
// There are currently 280 crates with docs and 100+
435-
// starts. This should be fine for a while.
414+
OFFSET FLOOR(RANDOM() * 280) LIMIT 1",
415+
&[]));
416+
// ~~~~~~^
417+
// FIXME: This is a fast query but using a constant
418+
// There are currently 280 crates with docs and 100+
419+
// starts. This should be fine for a while.
436420
let name: String = rows.get(0).get(0);
437421
let version: String = rows.get(0).get(1);
438422
let target_name: String = rows.get(0).get(2);
439-
let url = Url::parse(&format!("{}://{}:{}/{}/{}/{}",
440-
req.url.scheme,
441-
req.url.host,
442-
req.url.port,
443-
name,
444-
version,
445-
target_name))
446-
.unwrap();
423+
let url = ctry!(Url::parse(&format!("{}://{}:{}/{}/{}/{}",
424+
req.url.scheme,
425+
req.url.host,
426+
req.url.port,
427+
name,
428+
version,
429+
target_name)));
447430

448431
let mut resp = Response::with((status::Found, Redirect(url)));
449432
use iron::headers::{Expires, HttpDate};
@@ -454,13 +437,12 @@ pub fn search_handler(req: &mut Request) -> IronResult<Response> {
454437

455438

456439
if let Some(version) = match_version(&conn, &query, None) {
457-
let url = Url::parse(&format!("{}://{}:{}/crate/{}/{}",
440+
let url = ctry!(Url::parse(&format!("{}://{}:{}/crate/{}/{}",
458441
req.url.scheme,
459442
req.url.host,
460443
req.url.port,
461444
query,
462-
version)[..])
463-
.unwrap();
445+
version)[..]));
464446
let mut resp = Response::with((status::Found, Redirect(url)));
465447

466448
use iron::headers::{Expires, HttpDate};
@@ -488,11 +470,10 @@ pub fn search_handler(req: &mut Request) -> IronResult<Response> {
488470

489471

490472
pub fn activity_handler(req: &mut Request) -> IronResult<Response> {
491-
let conn = req.extensions.get::<Pool>().unwrap();
473+
let conn = extension!(req, Pool);
492474
let release_activity_data: Json =
493-
conn.query("SELECT value FROM config WHERE name = 'release_activity'",
494-
&[])
495-
.unwrap()
475+
ctry!(conn.query("SELECT value FROM config WHERE name = 'release_activity'",
476+
&[]))
496477
.get(0)
497478
.get(0);
498479
Page::new(release_activity_data)

0 commit comments

Comments
 (0)