1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
//! # Dce macros
//!
//! ## api(): proc_macro_attribute
//! An attribute-like macro, you can use it to define api, it will auto bind the controller func.
//!
//! **Parameters:**
//!
//!- *path `&str`*:\
//! The route path, it will be the controller func name if omitted, the style like "part1/part2", and support path params like the table below:
//!
//! example | matched | unmatched | description
//! - | - | - | -
//! {id}/detail | 1/detail | 1<br>1/info | required param, it could be every place in path
//! fruit/{target?} | fruit<br>fruit/apple | vegetable | optional param, it must be end of the path
//! fruit/{targets*} | fruit<br>fruit/apple/banana | vegetable | optional vec param, it must be end of the path
//! fruit/{targets+} | fruit/apple<br>fruit/apple/banana | fruit<br>vegetable | required vec param, it must be end of the path
//! fruit/{targets+}.\|html | fruit/apple<br>fruit/apple.html | fruit/apple.json | support non suffix or the ".html" suffix but not others
//! fruit/{targets+}.html\|json | fruit/apple.html<br>fruit/apple/banana.json | fruit/apple | support the ".html" or ".json" suffixes but not non or others
//!
//!- *serializer `Vec/struct`*:\
//! Response body data serializer, use to serialize the `DTO` into `sequences`, like `JsonSerializer{}`. It will be `UnreachableSerializer{}` if not defined.
//!
//!- *deserializer `Vec/struct`*:\
//! Request body data deserializer, use to deserialize the `sequences` into `DTO`, like `JsonSerializer{}`. It will be `UnreachableSerializer{}` if not defined.
//!
//!- *id `&str`*:\
//! Api ID, sometimes you want to use the shorter sign to mark an api, then you can define an id for it. Default value `""`.
//!
//!- *omission `bool`*:\
//! Define it is an omission part, for example `api("home/index", omission = true)` means you must use the path "home" to access it, because the "index" part is omission. Default value `false`.
//!
//!- *redirect `&str`*:\
//! Define the api should redirect to another one. Default value `""`.
//!
//!- *name `&str`*:\
//! Name the api. It will be the last part of path if not defined.
//!
//!- *unresponsive `bool`*:\
//! Define the api should not response, sometimes we want request a tcp or another long connection type service but not need response. Default value `false`.
//!
//! The params order is up to down, and you can use assignment expression style define it to break the fixed order.
//!
//
//! ## closed_err!(): proc_macro
//! A function-like macro to new a `DceErr` enum. Closed err means only print to console but not to response to client the specific error code and message.
//!
//! **Parameters:**
//!
//! - *code `isize`*:\
//! The error code, will be `0` if not specified.
//!
//! - *template `&str`*:\
//! The error message or a template.
//!
//! - *args `str-like[]`*:\
//! Template args.
//!
//!
//! ## open_err!(): proc_macro
//! A function-like macro to new a `DceErr` enum. Openly err means the specific error code and message will respond to client. Params same to `closed_err!()`.
//!
use TokenStream;
use quote;
use ;
use Api;
use DceError;