1mod rpc;
4mod transferable;
5mod utils;
6
7use proc_macro::TokenStream;
8use syn::parse_macro_input;
9
10#[proc_macro_derive(IntoTransferable, attributes(transferable, into_transferable))]
11pub fn derive_into_transferable(input: TokenStream) -> TokenStream {
12 transferable::into_transferable(parse_macro_input!(input))
13 .unwrap_or_else(|error| error.to_compile_error())
14 .into()
15}
16
17#[proc_macro_attribute]
18pub fn api(_attr: TokenStream, item: TokenStream) -> TokenStream {
19 rpc::api::api(item.into())
20 .unwrap_or_else(|error| error.to_compile_error())
21 .into()
22}
23
24#[proc_macro_attribute]
25pub fn no_serde(_attr: TokenStream, item: TokenStream) -> TokenStream {
26 item
27}
28
29#[proc_macro_attribute]
30pub fn no_ack(_attr: TokenStream, item: TokenStream) -> TokenStream {
31 item
32}
33
34#[proc_macro_attribute]
35pub fn abortable(_attr: TokenStream, item: TokenStream) -> TokenStream {
36 item
37}
38
39#[proc_macro_derive(Produce)]
40pub fn produce(input: TokenStream) -> TokenStream {
41 rpc::producer::produce(parse_macro_input!(input))
42 .unwrap_or_else(|error| error.to_compile_error())
43 .into()
44}
45
46#[cfg(test)]
47mod tests {
48 use prettyplease::unparse;
49 use proc_macro2::TokenStream;
50 use syn::parse_file;
51
52 pub fn pretty(item: TokenStream) -> String {
53 let file = parse_file(&item.to_string()).unwrap();
54 unparse(&file)
55 }
56
57 pub fn compare(expected: TokenStream, actual: TokenStream) {
58 let expected = pretty(expected);
59 let actual = pretty(actual);
60
61 if expected != actual {
62 panic!("\n\nEXPECTED:\n\n{expected}\n\n\nFOUND:\n\n{actual}\n");
63 }
64 }
65}