actix_derive/
lib.rs

1#![deny(rust_2018_idioms, nonstandard_style, future_incompatible)]
2#![doc(html_logo_url = "https://actix.rs/img/logo.png")]
3#![doc(html_favicon_url = "https://actix.rs/favicon.ico")]
4#![cfg_attr(docsrs, feature(doc_auto_cfg))]
5#![recursion_limit = "128"]
6
7use proc_macro::TokenStream;
8use quote::quote;
9use syn::DeriveInput;
10
11mod message;
12mod message_response;
13
14#[proc_macro_derive(Message, attributes(rtype))]
15pub fn message_derive_rtype(input: TokenStream) -> TokenStream {
16    let ast: DeriveInput = syn::parse(input).unwrap();
17
18    message::expand(&ast).into()
19}
20
21#[proc_macro_derive(MessageResponse)]
22pub fn message_response_derive_rtype(input: TokenStream) -> TokenStream {
23    let ast: DeriveInput = syn::parse(input).unwrap();
24
25    message_response::expand(&ast).into()
26}
27
28/// Marks async main function as the `actix` system entry-point.
29///
30/// # Examples
31///
32/// ```ignore
33/// #[actix::main]
34/// async fn main() {
35///     println!("Hello world");
36/// }
37/// ```
38#[proc_macro_attribute]
39pub fn main(_: TokenStream, item: TokenStream) -> TokenStream {
40    let mut output: TokenStream = (quote! {
41        #[::actix::__private::main(system = "::actix::System")]
42    })
43    .into();
44
45    output.extend(item);
46    output
47}
48
49/// Marks async test functions to use the `actix` system entry-point.
50///
51/// # Examples
52///
53/// ```ignore
54/// #[actix::test]
55/// async fn my_test() {
56///     assert!(true);
57/// }
58/// ```
59#[proc_macro_attribute]
60pub fn test(_: TokenStream, item: TokenStream) -> TokenStream {
61    let mut output: TokenStream = (quote! {
62        #[::actix::__private::test(system = "::actix::System")]
63    })
64    .into();
65
66    output.extend(item);
67    output
68}