Skip to main content

dnet_macros/
lib.rs

1//! Macros used by `dnet`.
2
3mod 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}