cosmwasm_derive/
lib.rs

1#[macro_use]
2extern crate syn;
3
4use proc_macro::TokenStream;
5use std::str::FromStr;
6
7// function documented in cosmwasm-std
8#[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    // The first argument is `deps`, the rest is region pointers
14    let args = function.sig.inputs.len() - 1;
15
16    // E.g. "ptr0: u32, ptr1: u32, ptr2: u32, "
17    let typed_ptrs = (0..args).fold(String::new(), |acc, i| format!("{acc}ptr{i}: u32, "));
18    // E.g. "ptr0, ptr1, ptr2, "
19    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}