1#[macro_use]
2extern crate syn;
3
4use proc_macro::TokenStream;
5use std::str::FromStr;
6
7#[proc_macro_attribute]
9pub fn entry_point(_attr: TokenStream, mut item: TokenStream) -> TokenStream {
10 let cloned = item.clone();
11 let function = parse_macro_input!(cloned as syn::ItemFn);
12 let name = function.sig.ident.to_string();
13 let args = function.sig.inputs.len() - 1;
15
16 let typed_ptrs = (0..args).fold(String::new(), |acc, i| format!("{acc}ptr{i}: u32, "));
18 let ptrs = (0..args).fold(String::new(), |acc, i| format!("{acc}ptr{i}, "));
20
21 let new_code = format!(
22 r##"
23 #[cfg(target_arch = "wasm32")]
24 mod __wasm_export_{name} {{ // new module to avoid conflict of function name
25 #[no_mangle]
26 extern "C" fn {name}({typed_ptrs}) -> u32 {{
27 cosmwasm_std::do_{name}(&super::{name}, {ptrs})
28 }}
29 }}
30 "##
31 );
32 let entry = TokenStream::from_str(&new_code).unwrap();
33 item.extend(entry);
34 item
35}