Как применить атрибут макроса к функции, определенной в отдельном модуле?

Я заинтересован в использовании wasm-bindgen с помощью rust-webpack-template скомпилировать код Rust в WebAssembly. Тем не менее, я бы хотел избежать прямого переноса кода на #[wasm_bindgen] Атрибут макроса напрямую, чтобы я мог отделить логику функции от сгенерированного интерфейса WebAssembly, чтобы лучше организовать свой проект. Вместо этого я бы предпочел, чтобы генерация привязки была в отдельном файле, например:

mod my_code;
use my_code::my_function;

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

Я это понимаю #[wasm_bindgen] является атрибутом макроса, который работает с AST определения функции, которое обычно следует, но есть ли подход для применения этого макроса к коду, определенному в другом месте?

1 ответ

Решение

Насколько я знаю, это невозможно сделать. Макросы работают с AST кода, к которому они прикреплены, и здесь нет кода, который можно прикрепить.

Если вам это действительно нужно, вам придется скопировать и вставить подпись вашей функции:

mod my_code {
    pub fn my_function(_: i32) -> String {
        unimplemented!()
    }
}

#[wasm_bindgen]
fn my_function(a: i32) -> String {
    my_code::my_function(a)
}

Возможно, вы могли бы написать макрос, чтобы сделать перенос немного менее утомительным, но вам все равно нужно будет повторить имя функции, типы аргументов и тип возвращаемого значения.

Другие вопросы по тегам