Skip to content

Commit

Permalink
Add support for async/streams/futures to Rust generator
Browse files Browse the repository at this point in the history
This adds support for generating bindings which use the [Async
ABI](https://github.com/WebAssembly/component-model/blob/main/design/mvp/Async.md)
along with the [`stream`, `future`, and
`error-context`](WebAssembly/component-model#405) types.

By default, normal synchronous bindings are generated, but the user may opt-in
to async bindings for all or some of the imported and/or exported functions in
the target world and interfaces -- provided the default-enabled `async` feature
is enabled.

In addition, we generate `StreamPayload` and/or `FuturePayload` trait
implementations for any types appearing as the `T` in `stream<T>` or `future<T>`
in the WIT files, respectively.  That enables user code to call `new_stream` or
`new_future` to create `stream`s or `future`s with those payload types, then
write to them, read from them, and/or pass the readable end as a parameter to a
component import or return value of a component export.

Note that I've added new `core::abi::Instruction` enum variants to handle async
lifting and lowering, but they're currently tailored to the Rust generator and
will probably change somewhat as we add support for other languages.

This does not include any new tests; I'll add those in a follow-up commit.

Signed-off-by: Joel Dice <joel.dice@fermyon.com>

add `async: true` case to Rust `codegen_tests`

This ensures that all the codegen test WIT files produce compile-able bindings
with `async: true` (i.e. all imports lowered and all exports lifted using the
async ABI).  That revealed some issues involving resource methods and
constructors, as well as missing stub support, which I've resolved.

Signed-off-by: Joel Dice <joel.dice@fermyon.com>

add codegen tests for futures, streams, and error-contexts

Signed-off-by: Joel Dice <joel.dice@fermyon.com>

remove async_support::poll_future

It was both unsafe to use and intended only for testing (and not even good for
that, it turns out).

Signed-off-by: Joel Dice <joel.dice@fermyon.com>

add stream/future read/write cancellation support

Also, fix some issues with stream/future payload lifting/lowering which I
_thought_ I had already tested but actually hadn't.

Signed-off-by: Joel Dice <joel.dice@fermyon.com>

support callback-less (AKA stackful) async lifts

Signed-off-by: Joel Dice <joel.dice@fermyon.com>

revert incorrect test change in flavorful/wasm.rs

I had thoughtlessly removed test code based on a clippy warning, not realizing
it was testing (at compile time) that the generated types implemented `Debug`.

Signed-off-by: Joel Dice <joel.dice@fermyon.com>

test `async: true` option in Rust codegen tests

I had meant to do this originally, but apparently forgot to actually use the
option.

Signed-off-by: Joel Dice <joel.dice@fermyon.com>

add docs for new `debug` and `async` Rust macro options

Signed-off-by: Joel Dice <joel.dice@fermyon.com>

address `cargo check` lifetime warning

Signed-off-by: Joel Dice <joel.dice@fermyon.com>

minimize use of features based on PR feedback

Signed-off-by: Joel Dice <joel.dice@fermyon.com>
  • Loading branch information
dicej committed Jan 7, 2025
1 parent 898b833 commit 44259f8
Show file tree
Hide file tree
Showing 39 changed files with 3,243 additions and 316 deletions.
134 changes: 91 additions & 43 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 44259f8

Please sign in to comment.