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}