hpl_attribute_compressed_account/
lib.rs

1extern crate proc_macro;
2mod renderers;
3mod utils;
4use syn::parse_macro_input;
5
6#[proc_macro_attribute]
7pub fn compressed_account(
8    args: proc_macro::TokenStream,
9    input: proc_macro::TokenStream,
10) -> proc_macro::TokenStream {
11    let renderer = args.to_string();
12    let renderee = input.to_string();
13
14    let chunk_key = if renderer.starts_with("chunk = ") {
15        Some(renderer.replace("chunk = ", ""))
16    } else {
17        None
18    };
19
20    if renderee.contains("struct") {
21        let account = parse_macro_input!(input as syn::ItemStruct);
22
23        if account.generics.params.len() > 0 {
24            panic!("`compressed_account` attribute does not allow generics");
25        }
26
27        renderers::CompressedAccountStruct::new(account, chunk_key).render()
28    } else if renderee.contains("enum") {
29        let account = parse_macro_input!(input as syn::ItemEnum);
30
31        if account.generics.params.len() > 0 {
32            panic!("`compressed_account` attribute does not allow generics");
33        }
34
35        renderers::CompressedAccountEnum::new(account, chunk_key).render()
36    } else {
37        panic!("Unknown structured provided for compressed data, only enum and struct are allowed")
38    }
39
40    // match renderer.as_str() {
41    //     "enm" | "" => {
42    //         let account = parse_macro_input!(input as syn::ItemEnum);
43
44    //         if account.generics.params.len() > 0 {
45    //             panic!("`compressed_account` attribute does not allow generics");
46    //         }
47
48    //         renderers::CompressedAccountEnum::new(account, chunk_key).render()
49    //     }
50    //     "strct" => {
51    //         let account = parse_macro_input!(input as syn::ItemStruct);
52
53    //         if account.generics.params.len() > 0 {
54    //             panic!("`compressed_account` attribute does not allow generics");
55    //         }
56
57    //         renderers::CompressedAccountStruct::new(account, chunk_key).render()
58    //     }
59    //     _ => {
60    //         if renderer.starts_with("chunk = ") {
61    //             let account = parse_macro_input!(input as syn::ItemStruct);
62
63    //             if account.generics.params.len() > 0 {
64    //                 panic!("`compressed_account` attribute does not allow generics");
65    //             }
66
67    //             renderers::CompressedAccountStruct::new(account, Some(chunk_key.to_string()))
68    //                 .render()
69    //         } else {
70    //             panic!(
71    //                 "`compressed_account` attribute does not support `{}` renderer",
72    //                 renderer
73    //             );
74    //         }
75    //     }
76    // }
77}