Skip to content

Commit 508a9d0

Browse files
authored
Improve logging & cexpect BuildPage.metadata (#976)
1 parent 6ecfa71 commit 508a9d0

File tree

3 files changed

+33
-19
lines changed

3 files changed

+33
-19
lines changed

src/web/builds.rs

+7-7
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ pub(crate) struct Build {
2626

2727
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
2828
struct BuildsPage {
29-
metadata: Option<MetaData>,
29+
metadata: MetaData,
3030
builds: Vec<Build>,
3131
build_details: Option<Build>,
3232
limits: Limits,
@@ -59,11 +59,11 @@ pub fn build_list_handler(req: &mut Request) -> IronResult<Response> {
5959
builds.build_status,
6060
builds.build_time,
6161
builds.output
62-
FROM builds
63-
INNER JOIN releases ON releases.id = builds.rid
64-
INNER JOIN crates ON releases.crate_id = crates.id
65-
WHERE crates.name = $1 AND releases.version = $2
66-
ORDER BY id DESC",
62+
FROM builds
63+
INNER JOIN releases ON releases.id = builds.rid
64+
INNER JOIN crates ON releases.crate_id = crates.id
65+
WHERE crates.name = $1 AND releases.version = $2
66+
ORDER BY id DESC",
6767
&[&name, &version]
6868
)
6969
);
@@ -111,7 +111,7 @@ pub fn build_list_handler(req: &mut Request) -> IronResult<Response> {
111111
Ok(resp)
112112
} else {
113113
BuildsPage {
114-
metadata: MetaData::from_crate(&mut conn, &name, &version),
114+
metadata: cexpect!(req, MetaData::from_crate(&mut conn, &name, &version)),
115115
builds,
116116
build_details,
117117
limits,

src/web/mod.rs

+15-4
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,20 @@ use log::{debug, info};
66

77
/// ctry! (cratesfyitry) is extremely similar to try! and itry!
88
/// except it returns an error page response instead of plain Err.
9+
#[macro_export]
910
macro_rules! ctry {
1011
($req:expr, $result:expr $(,)?) => {
1112
match $result {
1213
Ok(success) => success,
1314
Err(error) => {
14-
::log::error!("{}\n{:?}", error, ::backtrace::Backtrace::new());
15+
let request: &::iron::Request = $req;
16+
17+
::log::error!(
18+
"called ctry!() on an `Err` value: {}\nnote: while attempting to fetch the route {:?}\n{:?}",
19+
error,
20+
request.url,
21+
::backtrace::Backtrace::new(),
22+
);
1523

1624
// This is very ugly, but it makes it impossible to get a type inference error
1725
// from this macro
@@ -23,7 +31,7 @@ macro_rules! ctry {
2331
status: ::iron::status::BadRequest,
2432
};
2533

26-
return $crate::web::page::WebPage::into_response(error, $req);
34+
return $crate::web::page::WebPage::into_response(error, request);
2735
}
2836
}
2937
};
@@ -36,8 +44,11 @@ macro_rules! cexpect {
3644
match $option {
3745
Some(success) => success,
3846
None => {
47+
let request: &::iron::Request = $req;
48+
3949
::log::error!(
40-
"called cexpect!() on a `None` value\n{:?}",
50+
"called cexpect!() on a `None` value while attempting to fetch the route {:?}\n{:?}",
51+
request.url,
4152
::backtrace::Backtrace::new(),
4253
);
4354

@@ -49,7 +60,7 @@ macro_rules! cexpect {
4960
status: ::iron::status::BadRequest,
5061
};
5162

52-
return $crate::web::page::WebPage::into_response(error, $req);
63+
return $crate::web::page::WebPage::into_response(error, request);
5364
}
5465
}
5566
};

src/web/page/web_page.rs

+11-8
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use super::TemplateData;
2+
use crate::ctry;
23
use iron::{headers::ContentType, response::Response, status::Status, IronResult, Request};
34
use serde::Serialize;
45
use std::borrow::Cow;
@@ -10,6 +11,7 @@ macro_rules! impl_webpage {
1011
($page:ty = $template:literal $(, status = $status:expr)? $(, content_type = $content_type:expr)? $(,)?) => {
1112
impl_webpage!($page = |_| ::std::borrow::Cow::Borrowed($template) $(, status = $status)? $(, content_type = $content_type)?);
1213
};
14+
1315
($page:ty = $template:expr $(, status = $status:expr)? $(, content_type = $content_type:expr)? $(,)?) => {
1416
impl $crate::web::page::WebPage for $page {
1517
fn template(&self) -> ::std::borrow::Cow<'static, str> {
@@ -39,14 +41,15 @@ pub trait WebPage: Serialize + Sized {
3941
// TODO: We could cache similar pages using the `&Context`
4042
fn into_response(self, req: &Request) -> IronResult<Response> {
4143
let ctx = Context::from_serialize(&self).unwrap();
42-
let rendered = req
43-
.extensions
44-
.get::<TemplateData>()
45-
.expect("missing TemplateData from the request extensions")
46-
.templates
47-
.load()
48-
.render(&self.template(), &ctx)
49-
.unwrap();
44+
let rendered = ctry!(
45+
req,
46+
req.extensions
47+
.get::<TemplateData>()
48+
.expect("missing TemplateData from the request extensions")
49+
.templates
50+
.load()
51+
.render(&self.template(), &ctx)
52+
);
5053

5154
let mut response = Response::with((self.get_status(), rendered));
5255
response.headers.set(Self::content_type());

0 commit comments

Comments
 (0)