* Shard the `convert.rs` module into sub-modules Hopefully this'll make the organization a little nicer over time! * Start adding support for optional types This commit starts adding support for optional types to wasm-bindgen as arguments/return values to functions. The strategy here is to add two new traits, `OptionIntoWasmAbi` and `OptionFromWasmAbi`. These two traits are used as a blanket impl to implement `IntoWasmAbi` and `FromWasmAbi` for `Option<T>`. Some consequences of this design: * It should be possible to ensure `Option<SomeForeignType>` implements to/from wasm traits. This is because the option-based traits can be implemented for foreign types. * A specialized implementation is possible for all types, so there's no need for `Option<T>` to introduce unnecessary overhead. * Two new traits is a bit unforutnate but I can't currently think of an alternative design that works for the above two constraints, although it doesn't mean one doesn't exist! * The error messages for "can't use this type here" is actually halfway decent because it says these new traits need to be implemented, which provides a good place to document and talk about what's going on here! * Nested references like `Option<&T>` can't implement `FromWasmAbi`. This means that you can't define a function in Rust which takes `Option<&str>`. It may be possible to do this one day but it'll likely require more trait trickery than I'm capable of right now. * Add support for optional slices This commit adds support for optional slice types, things like strings and arrays. The null representation of these has a pointer value of 0, which should never happen in normal Rust. Otherwise the various plumbing is done throughout the tooling to enable these types in all locations. * Fix `takeObject` on global sentinels These don't have a reference count as they're always expected to work, so avoid actually dropping a reference on them. * Remove some no longer needed bindings * Add support for optional anyref types This commit adds support for optional imported class types. Each type imported with `#[wasm_bindgen]` automatically implements the relevant traits and now supports `Option<Foo>` in various argument/return positions. * Fix building without the `std` feature * Actually fix the build... * Add support for optional types to WebIDL Closes #502
1.0 KiB
Reference
The table below provides an overview of all the types that wasm-bindgen can send/receive across the wasm ABI boundary.
| Type | T
parameter | &T
parameter | &mut T
parameter | T
return value | Option<T>
parameter | Option<T>
return value |
|:---:|:---:|:---:|:---:|:---:|:---:|
| str
| No | Yes | No | Yes | Yes | No |
| char
| Yes | No | No | Yes | No | No |
| bool
| Yes | No | No | Yes | No | No |
| JsValue
| Yes | Yes | Yes | Yes | No | No |
| Box<[JsValue]>
| Yes | No | No | Yes | Yes | yes |
| *const T
| Yes | No | No | Yes | No | No |
| *mut T
| Yes | No | No | Yes | No | No |
| u8
i8
u16
i16
u64
i64
isize
size
| Yes | No | No | Yes | No | No |
| u32
i32
f32
f64
| Yes | Yes | Yes | Yes | No | No |
| Box<[u8]>
Box<[i8]>
Box<[u16]>
Box<[i16]>
Box<[u32]>
Box<[i32]>
Box<[u64]>
Box<[i64]>
Box<[f32]>
Box<[f64]
> | Yes | No | No | Yes | Yes | Yes |
| [u8]
[i8]
[u16]
[i16]
[u32]
[i32]
[u64]
[i64]
[f32]
[f64]
| No | Yes | Yes | No | Yes | No |