crayfish_macros/
lib.rs

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/// at!(place, func(a, b, c, d));
56#[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/// ff!(place, func(a, b, c, d));
64#[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}