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

半世苍凉 提交于 2019-12-31 05:09:13

问题


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?


回答1:


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.



来源:https://stackoverflow.com/questions/53364002/how-do-i-apply-a-macro-attribute-to-a-function-defined-in-a-separate-module

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!