1use proc_macro::TokenStream;
2use syn::parse_macro_input;
3use syn::AttributeArgs;
4use syn::Item;
5use syn::ItemFn;
6
7mod args;
8mod attr;
9mod func;
10mod utils;
11
12extern crate proc_macro;
13
14#[proc_macro_attribute]
15pub fn arg(args: TokenStream, item: TokenStream) -> TokenStream {
16 let args = parse_macro_input!(args as AttributeArgs);
17 let item = parse_macro_input!(item as Item);
18 args::impl_remote_send(args::RSendImpl::DefaultImpl, args, item)
19 .unwrap_or_else(|e| e.to_compile_error())
20 .into()
21}
22
23#[proc_macro_attribute]
24pub fn arg_squashable(args: TokenStream, item: TokenStream) -> TokenStream {
25 let args = parse_macro_input!(args as AttributeArgs);
26 let item = parse_macro_input!(item as Item);
27 args::impl_remote_send(args::RSendImpl::Squashable, args, item)
28 .unwrap_or_else(|e| e.to_compile_error())
29 .into()
30}
31
32#[proc_macro_attribute]
33pub fn arg_squashed(args: TokenStream, item: TokenStream) -> TokenStream {
34 let args = parse_macro_input!(args as AttributeArgs);
35 let item = parse_macro_input!(item as Item);
36 args::impl_remote_send(args::RSendImpl::Squashed, args, item)
37 .unwrap_or_else(|e| e.to_compile_error())
38 .into()
39}
40
41fn _activity(args: AttributeArgs, item: Item) -> syn::Result<proc_macro2::TokenStream> {
42 let attrs = attr::Attributes::new(args)?;
43 func::expand_async_func(attrs, item)
44}
45
46#[proc_macro_attribute]
47pub fn activity(args: TokenStream, item: TokenStream) -> TokenStream {
48 let args = parse_macro_input!(args as AttributeArgs);
49 let item = parse_macro_input!(item as Item);
50 _activity(args, item)
51 .unwrap_or_else(|e| e.to_compile_error())
52 .into()
53}
54
55#[proc_macro]
57pub fn at(input: TokenStream) -> TokenStream {
58 func::expand_at(input, func::SpawnMethod::At)
59 .unwrap_or_else(|e| e.to_compile_error())
60 .into()
61}
62
63#[proc_macro]
65pub fn ff(input: TokenStream) -> TokenStream {
66 func::expand_at(input, func::SpawnMethod::FireAndForget)
67 .unwrap_or_else(|e| e.to_compile_error())
68 .into()
69}
70
71#[proc_macro_attribute]
72pub fn finish_attr(args: TokenStream, input: TokenStream) -> TokenStream {
73 let args = parse_macro_input!(args as AttributeArgs);
74 func::finish(Some(args), input)
75 .unwrap_or_else(|e| e.to_compile_error())
76 .into()
77}
78
79#[proc_macro]
80pub fn finish(input: TokenStream) -> TokenStream {
81 func::finish(None, input)
82 .unwrap_or_else(|e| e.to_compile_error())
83 .into()
84}
85
86#[proc_macro_attribute]
87pub fn main(args: TokenStream, input: TokenStream) -> TokenStream {
88 let args = parse_macro_input!(args as AttributeArgs);
89 let item_fn = parse_macro_input!(input as ItemFn);
90 func::main(args, item_fn)
91 .unwrap_or_else(|e| e.to_compile_error())
92 .into()
93}