scrappy_web_codegen/
lib.rs

1#![recursion_limit = "512"]
2//! scrappy-web codegen module
3//!
4//! Generators for routes and scopes
5//!
6//! ## Route
7//!
8//! Macros:
9//!
10//! - [get](attr.get.html)
11//! - [post](attr.post.html)
12//! - [put](attr.put.html)
13//! - [delete](attr.delete.html)
14//! - [head](attr.head.html)
15//! - [connect](attr.connect.html)
16//! - [options](attr.options.html)
17//! - [trace](attr.trace.html)
18//! - [patch](attr.patch.html)
19//!
20//! ### Attributes:
21//!
22//! - `"path"` - Raw literal string with path for which to register handle. Mandatory.
23//! - `guard="function_name"` - Registers function as guard using `scrappy::guard::fn_guard`
24//!
25//! ## Notes
26//!
27//! Function name can be specified as any expression that is going to be accessible to the generate
28//! code (e.g `my_guard` or `my_module::my_guard`)
29//!
30//! ## Example:
31//!
32//! ```rust
33//! use scrappy::HttpResponse;
34//! use scrappy_codegen::get;
35//! use futures::{future, Future};
36//!
37//! #[get("/test")]
38//! async fn async_test() -> Result<HttpResponse, scrappy::Error> {
39//!     Ok(HttpResponse::Ok().finish())
40//! }
41//! ```
42
43extern crate proc_macro;
44
45mod route;
46
47use proc_macro::TokenStream;
48use syn::parse_macro_input;
49
50/// Creates route handler with `GET` method guard.
51///
52/// Syntax: `#[get("path"[, attributes])]`
53///
54/// ## Attributes:
55///
56/// - `"path"` - Raw literal string with path for which to register handler. Mandatory.
57/// - `guard="function_name"` - Registers function as guard using `scrappy::guard::fn_guard`
58#[proc_macro_attribute]
59pub fn get(args: TokenStream, input: TokenStream) -> TokenStream {
60    let args = parse_macro_input!(args as syn::AttributeArgs);
61    let gen = match route::Route::new(args, input, route::GuardType::Get) {
62        Ok(gen) => gen,
63        Err(err) => return err.to_compile_error().into(),
64    };
65    gen.generate()
66}
67
68/// Creates route handler with `POST` method guard.
69///
70/// Syntax: `#[post("path"[, attributes])]`
71///
72/// Attributes are the same as in [get](attr.get.html)
73#[proc_macro_attribute]
74pub fn post(args: TokenStream, input: TokenStream) -> TokenStream {
75    let args = parse_macro_input!(args as syn::AttributeArgs);
76    let gen = match route::Route::new(args, input, route::GuardType::Post) {
77        Ok(gen) => gen,
78        Err(err) => return err.to_compile_error().into(),
79    };
80    gen.generate()
81}
82
83/// Creates route handler with `PUT` method guard.
84///
85/// Syntax: `#[put("path"[, attributes])]`
86///
87/// Attributes are the same as in [get](attr.get.html)
88#[proc_macro_attribute]
89pub fn put(args: TokenStream, input: TokenStream) -> TokenStream {
90    let args = parse_macro_input!(args as syn::AttributeArgs);
91    let gen = match route::Route::new(args, input, route::GuardType::Put) {
92        Ok(gen) => gen,
93        Err(err) => return err.to_compile_error().into(),
94    };
95    gen.generate()
96}
97
98/// Creates route handler with `DELETE` method guard.
99///
100/// Syntax: `#[delete("path"[, attributes])]`
101///
102/// Attributes are the same as in [get](attr.get.html)
103#[proc_macro_attribute]
104pub fn delete(args: TokenStream, input: TokenStream) -> TokenStream {
105    let args = parse_macro_input!(args as syn::AttributeArgs);
106    let gen = match route::Route::new(args, input, route::GuardType::Delete) {
107        Ok(gen) => gen,
108        Err(err) => return err.to_compile_error().into(),
109    };
110    gen.generate()
111}
112
113/// Creates route handler with `HEAD` method guard.
114///
115/// Syntax: `#[head("path"[, attributes])]`
116///
117/// Attributes are the same as in [head](attr.head.html)
118#[proc_macro_attribute]
119pub fn head(args: TokenStream, input: TokenStream) -> TokenStream {
120    let args = parse_macro_input!(args as syn::AttributeArgs);
121    let gen = match route::Route::new(args, input, route::GuardType::Head) {
122        Ok(gen) => gen,
123        Err(err) => return err.to_compile_error().into(),
124    };
125    gen.generate()
126}
127
128/// Creates route handler with `CONNECT` method guard.
129///
130/// Syntax: `#[connect("path"[, attributes])]`
131///
132/// Attributes are the same as in [connect](attr.connect.html)
133#[proc_macro_attribute]
134pub fn connect(args: TokenStream, input: TokenStream) -> TokenStream {
135    let args = parse_macro_input!(args as syn::AttributeArgs);
136    let gen = match route::Route::new(args, input, route::GuardType::Connect) {
137        Ok(gen) => gen,
138        Err(err) => return err.to_compile_error().into(),
139    };
140    gen.generate()
141}
142
143/// Creates route handler with `OPTIONS` method guard.
144///
145/// Syntax: `#[options("path"[, attributes])]`
146///
147/// Attributes are the same as in [options](attr.options.html)
148#[proc_macro_attribute]
149pub fn options(args: TokenStream, input: TokenStream) -> TokenStream {
150    let args = parse_macro_input!(args as syn::AttributeArgs);
151    let gen = match route::Route::new(args, input, route::GuardType::Options) {
152        Ok(gen) => gen,
153        Err(err) => return err.to_compile_error().into(),
154    };
155    gen.generate()
156}
157
158/// Creates route handler with `TRACE` method guard.
159///
160/// Syntax: `#[trace("path"[, attributes])]`
161///
162/// Attributes are the same as in [trace](attr.trace.html)
163#[proc_macro_attribute]
164pub fn trace(args: TokenStream, input: TokenStream) -> TokenStream {
165    let args = parse_macro_input!(args as syn::AttributeArgs);
166    let gen = match route::Route::new(args, input, route::GuardType::Trace) {
167        Ok(gen) => gen,
168        Err(err) => return err.to_compile_error().into(),
169    };
170    gen.generate()
171}
172
173/// Creates route handler with `PATCH` method guard.
174///
175/// Syntax: `#[patch("path"[, attributes])]`
176///
177/// Attributes are the same as in [patch](attr.patch.html)
178#[proc_macro_attribute]
179pub fn patch(args: TokenStream, input: TokenStream) -> TokenStream {
180    let args = parse_macro_input!(args as syn::AttributeArgs);
181    let gen = match route::Route::new(args, input, route::GuardType::Patch) {
182        Ok(gen) => gen,
183        Err(err) => return err.to_compile_error().into(),
184    };
185    gen.generate()
186}