Skip to content

Commit

Permalink
Refactor actix-codegen duplicate code (actix#1423)
Browse files Browse the repository at this point in the history
Co-authored-by: Yuki Okushi <[email protected]>
  • Loading branch information
pickfire and JohnTitor authored Mar 19, 2020
1 parent bf630d9 commit 2067331
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 49 deletions.
57 changes: 9 additions & 48 deletions actix-web-codegen/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,6 @@ extern crate proc_macro;
mod route;

use proc_macro::TokenStream;
use quote::ToTokens;
use route::Route;
use syn::parse_macro_input;

/// Creates route handler with `GET` method guard.
///
Expand All @@ -59,11 +56,7 @@ use syn::parse_macro_input;
/// - `guard="function_name"` - Registers function as guard using `actix_web::guard::fn_guard`
#[proc_macro_attribute]
pub fn get(args: TokenStream, input: TokenStream) -> TokenStream {
let args = parse_macro_input!(args as syn::AttributeArgs);
match Route::new(args, input, route::GuardType::Get) {
Ok(route) => route.into_token_stream().into(),
Err(err) => err.to_compile_error().into(),
}
route::generate(args, input, route::GuardType::Get)
}

/// Creates route handler with `POST` method guard.
Expand All @@ -73,11 +66,7 @@ pub fn get(args: TokenStream, input: TokenStream) -> TokenStream {
/// Attributes are the same as in [get](attr.get.html)
#[proc_macro_attribute]
pub fn post(args: TokenStream, input: TokenStream) -> TokenStream {
let args = parse_macro_input!(args as syn::AttributeArgs);
match Route::new(args, input, route::GuardType::Post) {
Ok(route) => route.into_token_stream().into(),
Err(err) => err.to_compile_error().into(),
}
route::generate(args, input, route::GuardType::Post)
}

/// Creates route handler with `PUT` method guard.
Expand All @@ -87,11 +76,7 @@ pub fn post(args: TokenStream, input: TokenStream) -> TokenStream {
/// Attributes are the same as in [get](attr.get.html)
#[proc_macro_attribute]
pub fn put(args: TokenStream, input: TokenStream) -> TokenStream {
let args = parse_macro_input!(args as syn::AttributeArgs);
match Route::new(args, input, route::GuardType::Put) {
Ok(route) => route.into_token_stream().into(),
Err(err) => err.to_compile_error().into(),
}
route::generate(args, input, route::GuardType::Put)
}

/// Creates route handler with `DELETE` method guard.
Expand All @@ -101,11 +86,7 @@ pub fn put(args: TokenStream, input: TokenStream) -> TokenStream {
/// Attributes are the same as in [get](attr.get.html)
#[proc_macro_attribute]
pub fn delete(args: TokenStream, input: TokenStream) -> TokenStream {
let args = parse_macro_input!(args as syn::AttributeArgs);
match Route::new(args, input, route::GuardType::Delete) {
Ok(route) => route.into_token_stream().into(),
Err(err) => err.to_compile_error().into(),
}
route::generate(args, input, route::GuardType::Delete)
}

/// Creates route handler with `HEAD` method guard.
Expand All @@ -115,11 +96,7 @@ pub fn delete(args: TokenStream, input: TokenStream) -> TokenStream {
/// Attributes are the same as in [head](attr.head.html)
#[proc_macro_attribute]
pub fn head(args: TokenStream, input: TokenStream) -> TokenStream {
let args = parse_macro_input!(args as syn::AttributeArgs);
match Route::new(args, input, route::GuardType::Head) {
Ok(route) => route.into_token_stream().into(),
Err(err) => err.to_compile_error().into(),
}
route::generate(args, input, route::GuardType::Head)
}

/// Creates route handler with `CONNECT` method guard.
Expand All @@ -129,11 +106,7 @@ pub fn head(args: TokenStream, input: TokenStream) -> TokenStream {
/// Attributes are the same as in [connect](attr.connect.html)
#[proc_macro_attribute]
pub fn connect(args: TokenStream, input: TokenStream) -> TokenStream {
let args = parse_macro_input!(args as syn::AttributeArgs);
match Route::new(args, input, route::GuardType::Connect) {
Ok(route) => route.into_token_stream().into(),
Err(err) => err.to_compile_error().into(),
}
route::generate(args, input, route::GuardType::Connect)
}

/// Creates route handler with `OPTIONS` method guard.
Expand All @@ -143,11 +116,7 @@ pub fn connect(args: TokenStream, input: TokenStream) -> TokenStream {
/// Attributes are the same as in [options](attr.options.html)
#[proc_macro_attribute]
pub fn options(args: TokenStream, input: TokenStream) -> TokenStream {
let args = parse_macro_input!(args as syn::AttributeArgs);
match Route::new(args, input, route::GuardType::Options) {
Ok(route) => route.into_token_stream().into(),
Err(err) => err.to_compile_error().into(),
}
route::generate(args, input, route::GuardType::Options)
}

/// Creates route handler with `TRACE` method guard.
Expand All @@ -157,11 +126,7 @@ pub fn options(args: TokenStream, input: TokenStream) -> TokenStream {
/// Attributes are the same as in [trace](attr.trace.html)
#[proc_macro_attribute]
pub fn trace(args: TokenStream, input: TokenStream) -> TokenStream {
let args = parse_macro_input!(args as syn::AttributeArgs);
match Route::new(args, input, route::GuardType::Trace) {
Ok(route) => route.into_token_stream().into(),
Err(err) => err.to_compile_error().into(),
}
route::generate(args, input, route::GuardType::Trace)
}

/// Creates route handler with `PATCH` method guard.
Expand All @@ -171,9 +136,5 @@ pub fn trace(args: TokenStream, input: TokenStream) -> TokenStream {
/// Attributes are the same as in [patch](attr.patch.html)
#[proc_macro_attribute]
pub fn patch(args: TokenStream, input: TokenStream) -> TokenStream {
let args = parse_macro_input!(args as syn::AttributeArgs);
match Route::new(args, input, route::GuardType::Patch) {
Ok(route) => route.into_token_stream().into(),
Err(err) => err.to_compile_error().into(),
}
route::generate(args, input, route::GuardType::Patch)
}
14 changes: 13 additions & 1 deletion actix-web-codegen/src/route.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ extern crate proc_macro;
use proc_macro::TokenStream;
use proc_macro2::{Span, TokenStream as TokenStream2};
use quote::{format_ident, quote, ToTokens, TokenStreamExt};
use syn::{AttributeArgs, Ident, NestedMeta};
use syn::{AttributeArgs, Ident, NestedMeta, parse_macro_input};

enum ResourceType {
Async,
Expand Down Expand Up @@ -209,3 +209,15 @@ impl ToTokens for Route {
output.extend(stream);
}
}

pub(crate) fn generate(
args: TokenStream,
input: TokenStream,
guard: GuardType,
) -> TokenStream {
let args = parse_macro_input!(args as syn::AttributeArgs);
match Route::new(args, input, guard) {
Ok(route) => route.into_token_stream().into(),
Err(err) => err.to_compile_error().into(),
}
}

0 comments on commit 2067331

Please sign in to comment.