Added method specific macros.

This commit is contained in:
Sergio Benitez 2016-08-08 18:34:18 -07:00
parent c7b1eebd20
commit eabb5169de
5 changed files with 60 additions and 15 deletions

View File

@ -15,7 +15,7 @@ struct UserLogin<'r> {
age: Result<isize, &'r str>, age: Result<isize, &'r str>,
} }
#[route(POST, path = "/login", form = "<user>")] #[POST(path = "/login", form = "<user>")]
fn login(user: UserLogin) -> Result<Redirect, String> { fn login(user: UserLogin) -> Result<Redirect, String> {
if user.age.is_err() { if user.age.is_err() {
let input = user.age.unwrap_err(); let input = user.age.unwrap_err();
@ -36,7 +36,7 @@ fn login(user: UserLogin) -> Result<Redirect, String> {
} }
} }
#[route(GET, path = "/user/<username>")] #[GET(path = "/user/<username>")]
fn user_page(username: &str) -> String { fn user_page(username: &str) -> String {
format!("This is {}'s page.", username) format!("This is {}'s page.", username)
} }

View File

@ -4,7 +4,7 @@
extern crate rocket; extern crate rocket;
use rocket::Rocket; use rocket::Rocket;
#[route(GET, path = "/hello/<name>/<age>")] #[GET(path = "/hello/<name>/<age>")]
fn hello(name: &str, age: i8) -> String { fn hello(name: &str, age: i8) -> String {
format!("Hello, {} year old named {}!", age, name) format!("Hello, {} year old named {}!", age, name)
} }

View File

@ -4,7 +4,7 @@
extern crate rocket; extern crate rocket;
use rocket::Rocket; use rocket::Rocket;
#[route(GET, path = "/")] #[GET(path = "/")]
fn root() -> &'static str { fn root() -> &'static str {
"Hello, world!" "Hello, world!"
} }

View File

@ -21,7 +21,7 @@ use syntax::parse::token::intern;
use routes_macro::routes_macro; use routes_macro::routes_macro;
use errors_macro::errors_macro; use errors_macro::errors_macro;
use route_decorator::route_decorator; use route_decorator::*;
use error_decorator::error_decorator; use error_decorator::error_decorator;
use derive_form::from_form_derive; use derive_form::from_form_derive;
@ -30,16 +30,32 @@ const CATCH_STRUCT_PREFIX: &'static str = "static_rocket_catch_info_for_";
const ROUTE_FN_PREFIX: &'static str = "rocket_route_fn_"; const ROUTE_FN_PREFIX: &'static str = "rocket_route_fn_";
const CATCH_FN_PREFIX: &'static str = "rocket_catch_fn_"; const CATCH_FN_PREFIX: &'static str = "rocket_catch_fn_";
macro_rules! register_decorators {
($registry:expr, $($name:expr => $func:expr),+) => (
$($registry.register_syntax_extension(intern($name),
SyntaxExtension::MultiDecorator(Box::new($func)));
)+
)
}
#[plugin_registrar] #[plugin_registrar]
pub fn plugin_registrar(reg: &mut Registry) { pub fn plugin_registrar(reg: &mut Registry) {
reg.register_syntax_extension(intern("route"),
SyntaxExtension::MultiDecorator(Box::new(route_decorator)));
reg.register_syntax_extension(intern("error"),
SyntaxExtension::MultiDecorator(Box::new(error_decorator)));
reg.register_syntax_extension(intern("derive_FromForm"),
SyntaxExtension::MultiDecorator(Box::new(from_form_derive)));
reg.register_macro("routes", routes_macro); reg.register_macro("routes", routes_macro);
reg.register_macro("errors", errors_macro); reg.register_macro("errors", errors_macro);
// reg.register_macro("GET", get_macro); register_decorators!(reg,
"derive_FromForm" => from_form_derive,
"route" => generic_route_decorator,
"error" => error_decorator,
"GET" => get_decorator,
"PUT" => put_decorator,
"POST" => post_decorator,
"DELETE" => delete_decorator,
"OPTIONS" => options_decorator,
"HEAD" => head_decorator,
"TRACE" => trace_decorator,
"CONNECT" => connect_decorator,
"PATCH" => patch_decorator
);
} }

View File

@ -130,14 +130,15 @@ fn method_variant_to_expr(ecx: &ExtCtxt, method: Method) -> P<Expr> {
} }
// FIXME: Compilation fails when parameters have the same name as the function! // FIXME: Compilation fails when parameters have the same name as the function!
pub fn route_decorator(ecx: &mut ExtCtxt, sp: Span, meta_item: &MetaItem, pub fn route_decorator(known_method: Option<Spanned<Method>>, ecx: &mut ExtCtxt,
annotated: &Annotatable, push: &mut FnMut(Annotatable)) { sp: Span, meta_item: &MetaItem, annotated: &Annotatable,
push: &mut FnMut(Annotatable)) {
// Get the encompassing item and function declaration for the annotated func. // Get the encompassing item and function declaration for the annotated func.
let parser = MetaItemParser::new(ecx, meta_item, annotated, &sp); let parser = MetaItemParser::new(ecx, meta_item, annotated, &sp);
let (item, fn_decl) = (parser.expect_item(), parser.expect_fn_decl()); let (item, fn_decl) = (parser.expect_item(), parser.expect_fn_decl());
// Parse and retrieve all of the parameters of the route. // Parse and retrieve all of the parameters of the route.
let route = parser.parse_route(None); let route = parser.parse_route(known_method);
// Get a list of the user declared parameters in `path` and `form`. // Get a list of the user declared parameters in `path` and `form`.
let path_params = extract_params_from_kv(&parser, &route.path); let path_params = extract_params_from_kv(&parser, &route.path);
@ -221,3 +222,31 @@ pub fn route_decorator(ecx: &mut ExtCtxt, sp: Span, meta_item: &MetaItem,
).unwrap())); ).unwrap()));
} }
pub fn generic_route_decorator(ecx: &mut ExtCtxt,
sp: Span, meta_item: &MetaItem, annotated: &Annotatable,
push: &mut FnMut(Annotatable)) {
route_decorator(None, ecx, sp, meta_item, annotated, push);
}
macro_rules! method_decorator {
($name:ident, $method:ident) => (
pub fn $name(ecx: &mut ExtCtxt, sp: Span, meta_item: &MetaItem,
annotated: &Annotatable, push: &mut FnMut(Annotatable)) {
let mut i_sp = meta_item.span;
i_sp.hi = i_sp.lo + BytePos(meta_item.name().len() as u32);
let method = Some(span(Method::$method, i_sp));
route_decorator(method, ecx, sp, meta_item, annotated, push);
}
)
}
method_decorator!(get_decorator, Get);
method_decorator!(put_decorator, Put);
method_decorator!(post_decorator, Post);
method_decorator!(delete_decorator, Delete);
method_decorator!(options_decorator, Options);
method_decorator!(head_decorator, Head);
method_decorator!(trace_decorator, Trace);
method_decorator!(connect_decorator, Connect);
method_decorator!(patch_decorator, Patch);