Search code examples
rustrust-macroswasm-bindgen

How do I apply a macro attribute to a function defined in a separate module?


I'm interested in using wasm-bindgen via rust-webpack-template to compile Rust code to WebAssembly. However, I'd like to avoid directly wrapping my code with the #[wasm_bindgen] attribute macro directly so that I can separate out the function logic from the generated WebAssembly interface to better organize my project. Instead, I would prefer to have binding generation be in a separate file, for example:

mod my_code;
use my_code::my_function;

#[wasm_bindgen]
my_function; // I want to do something like this!

I understand that #[wasm_bindgen] is a macro attribute that operates on the AST of the function definition that usually follows, but is there an approach for applying that macro to code defined elsewhere?


Solution

  • As far as I know, there's no way to do this. Macros operate on the AST of the code they are attached to, and there's no code to be attached to here.

    If you really need this, you'll have to copy-and-paste the signature of your function:

    mod my_code {
        pub fn my_function(_: i32) -> String {
            unimplemented!()
        }
    }
    
    #[wasm_bindgen]
    fn my_function(a: i32) -> String {
        my_code::my_function(a)
    }
    

    It's possible you could write a macro to make the wrapping slightly less tedious, but you'll still need to replicate the function name, argument types, and return type.