I'm new to webassembly. I want to create a simple greedy snake game using canvas and wasm_bindgen
.
My rust code:
#[wasm_bindgen]
impl CanvasData {
pub fn index_to_coordinate(&self, index: usize) -> (usize, usize) {
(index % self.cell_count, index / self.cell_count)
}
}
CanvasData
is a struct that saves data of the canvas, cell_count
attribute is usize
type, it represents the number of horizontal and vertical grids on the square canvas. Here I treat all the grids on the canvas as a one-dimensional array from left to right and from top to bottom. The purpose of this method is to map the array index to x, y coordinates. I want to return a tuple and call it in the front end as follows:
const [x, y] = canvasData.index_to_coordinate(100)
However, an error occurred during building.
Build script:
wasm-pack build -t web
Error:
error[E0277]: the trait bound `(usize, usize): IntoWasmAbi` is not satisfied
[0] --> src\lib.rs:16:1
[0] |
[0] 16 | #[wasm_bindgen]
[0] | ^^^^^^^^^^^^^^^ the trait `IntoWasmAbi` is not implemented for `(usize, usize)`
[0] |
[0] = help: the trait `IntoWasmAbi` is implemented for `()`
[0] = note: required because of the requirements on the impl of `ReturnWasmAbi` for `(usize, usize)`
[0] = note: this error originates in the attribute macro `wasm_bindgen::prelude::__wasm_bindgen_class_marker` (in Nightly builds, run with -Z macro-backtrace for more info)
How to reslove this?
I believe
tuples
are not currently allowed becausewasm-bindgen
is waiting for tuples to be added to javascript so there isnt future inconstancy/breakage between rust and js. There is an open issue onwasm-bindgen
asking fortuples
and fixed-sized arrays here.For now, the best approach is probably to just create a tuple struct.
Then you can deconstruct it in javascript the same way.
Or use a struct with named fields and deconstruct the object