rweb_macros/
lib.rs

1extern crate proc_macro;
2use self::route::compile_route;
3use pmutil::{q, ToTokensExt};
4
5mod openapi;
6mod parse;
7mod path;
8mod route;
9mod router;
10mod util;
11
12#[proc_macro_attribute]
13pub fn get(
14    path: proc_macro::TokenStream,
15    fn_item: proc_macro::TokenStream,
16) -> proc_macro::TokenStream {
17    compile_route(Some(q!({ get })), path.into(), fn_item.into())
18}
19
20#[proc_macro_attribute]
21pub fn post(
22    path: proc_macro::TokenStream,
23    fn_item: proc_macro::TokenStream,
24) -> proc_macro::TokenStream {
25    compile_route(Some(q!({ post })), path.into(), fn_item.into())
26}
27
28#[proc_macro_attribute]
29pub fn put(
30    path: proc_macro::TokenStream,
31    fn_item: proc_macro::TokenStream,
32) -> proc_macro::TokenStream {
33    compile_route(Some(q!({ put })), path.into(), fn_item.into())
34}
35
36#[proc_macro_attribute]
37pub fn delete(
38    path: proc_macro::TokenStream,
39    fn_item: proc_macro::TokenStream,
40) -> proc_macro::TokenStream {
41    compile_route(Some(q!({ delete })), path.into(), fn_item.into())
42}
43
44#[proc_macro_attribute]
45pub fn head(
46    path: proc_macro::TokenStream,
47    fn_item: proc_macro::TokenStream,
48) -> proc_macro::TokenStream {
49    compile_route(Some(q!({ head })), path.into(), fn_item.into())
50}
51
52#[proc_macro_attribute]
53pub fn options(
54    path: proc_macro::TokenStream,
55    fn_item: proc_macro::TokenStream,
56) -> proc_macro::TokenStream {
57    compile_route(Some(q!({ options })), path.into(), fn_item.into())
58}
59
60#[proc_macro_attribute]
61pub fn patch(
62    path: proc_macro::TokenStream,
63    fn_item: proc_macro::TokenStream,
64) -> proc_macro::TokenStream {
65    compile_route(Some(q!({ patch })), path.into(), fn_item.into())
66}
67
68/// Creates a router. Useful for modularizing codes.
69///
70///
71/// # Note
72///
73/// Currently router returns 404 error if there is a no matching rule.
74#[proc_macro_attribute]
75pub fn router(
76    attr: proc_macro::TokenStream,
77    item: proc_macro::TokenStream,
78) -> proc_macro::TokenStream {
79    router::router(attr.into(), item.into()).dump().into()
80}
81
82/// Implements Entity for the type.
83///
84/// See documentation of Entity for details and examples.
85#[proc_macro_derive(Schema, attributes(schema))]
86pub fn derive_schema(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
87    if !cfg!(feature = "openapi") {
88        return "".parse().unwrap();
89    }
90    let input = syn::parse::<syn::DeriveInput>(input).expect("failed to parse derive input");
91    openapi::derive_schema(input).into()
92}