Skip to content

Commit 4527203

Browse files
committed
Fix issue #1.
1 parent 2fc2032 commit 4527203

File tree

5 files changed

+49
-5
lines changed

5 files changed

+49
-5
lines changed

Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,5 @@ members = [
1616
"examples/content_types",
1717
"examples/hello_ranks",
1818
"examples/testing",
19+
"examples/from_request",
1920
]

examples/from_request/Cargo.toml

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
[package]
2+
name = "from_request"
3+
version = "0.0.1"
4+
authors = ["Sergio Benitez <sb@sergio.bz>"]
5+
workspace = "../../"
6+
7+
[dependencies]
8+
rocket = { path = "../../lib" }
9+
rocket_macros = { path = "../../macros" }

examples/from_request/src/main.rs

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#![feature(plugin)]
2+
#![plugin(rocket_macros)]
3+
4+
extern crate rocket;
5+
6+
use std::fmt;
7+
use rocket::Rocket;
8+
use rocket::request::{Request, FromRequest};
9+
10+
#[derive(Debug)]
11+
struct HeaderCount(usize);
12+
13+
impl fmt::Display for HeaderCount {
14+
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
15+
write!(f, "{}", self.0)
16+
}
17+
}
18+
19+
impl<'r, 'c> FromRequest<'r, 'c> for HeaderCount {
20+
type Error = ();
21+
fn from_request(request: &'r Request<'c>) -> Result<Self, Self::Error> {
22+
Ok(HeaderCount(request.headers().len()))
23+
}
24+
}
25+
26+
#[get("/")]
27+
fn header_count(header_count: HeaderCount) -> String {
28+
format!("Your request contained {} headers!", header_count)
29+
}
30+
31+
fn main() {
32+
Rocket::new("localhost", 8000).mount_and_launch("/", routes![header_count]);
33+
}

macros/src/decorators/route.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use std::collections::HashSet;
22

3-
use ::{ROUTE_STRUCT_PREFIX, ROUTE_FN_PREFIX};
3+
use ::{ROUTE_STRUCT_PREFIX, ROUTE_FN_PREFIX, PARAM_PREFIX};
44
use utils::{emit_item, span, sep_by_tok, SpanExt, IdentExt, ArgExt, option_as_expr};
55
use parser::RouteParams;
66

@@ -67,7 +67,7 @@ impl RouteGenerateExt for RouteParams {
6767
}
6868

6969
let arg = arg.unwrap();
70-
let (name, ty) = (arg.ident().unwrap(), &arg.ty);
70+
let (name, ty) = (arg.ident().unwrap().prepend(PARAM_PREFIX), &arg.ty);
7171
Some(quote_stmt!(ecx,
7272
let $name: $ty =
7373
if let Ok(s) = ::std::str::from_utf8(_req.data.as_slice()) {
@@ -107,7 +107,7 @@ impl RouteGenerateExt for RouteParams {
107107

108108
// Generate code for each user declared parameter.
109109
for (i, arg) in all.iter().filter(declared).enumerate() {
110-
let (ident, ty) = (arg.ident().unwrap(), &arg.ty);
110+
let (ident, ty) = (arg.ident().unwrap().prepend(PARAM_PREFIX), &arg.ty);
111111
fn_param_statements.push(quote_stmt!(ecx,
112112
let $ident: $ty = match _req.get_param($i) {
113113
Ok(v) => v,
@@ -125,7 +125,7 @@ impl RouteGenerateExt for RouteParams {
125125

126126
// Generate the code for `form_request` parameters.
127127
for arg in all.iter().filter(from_request) {
128-
let (ident, ty) = (arg.ident().unwrap(), &arg.ty);
128+
let (ident, ty) = (arg.ident().unwrap().prepend(PARAM_PREFIX), &arg.ty);
129129
fn_param_statements.push(quote_stmt!(ecx,
130130
let $ident: $ty = match
131131
<$ty as ::rocket::request::FromRequest>::from_request(&_req) {
@@ -140,7 +140,7 @@ impl RouteGenerateExt for RouteParams {
140140

141141
fn generate_fn_arguments(&self, ecx: &ExtCtxt) -> Vec<TokenTree> {
142142
let args = self.annotated_fn.decl().inputs.iter().map(|a| {
143-
a.ident().expect("function decl pat -> ident").clone()
143+
a.ident().expect("function decl pat -> ident").prepend(PARAM_PREFIX)
144144
}).collect::<Vec<Ident>>();
145145

146146
sep_by_tok(ecx, &args, token::Comma)

macros/src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ use rustc_plugin::Registry;
2121
use syntax::ext::base::SyntaxExtension;
2222
use syntax::parse::token::intern;
2323

24+
const PARAM_PREFIX: &'static str = "rocket_param_";
2425
const ROUTE_STRUCT_PREFIX: &'static str = "static_rocket_route_info_for_";
2526
const CATCH_STRUCT_PREFIX: &'static str = "static_rocket_catch_info_for_";
2627
const ROUTE_FN_PREFIX: &'static str = "rocket_route_fn_";

0 commit comments

Comments
 (0)