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>
  • Loading branch information
dicej committed Nov 6, 2024
1 parent b0db20b commit 8ebfc1e
Show file tree
Hide file tree
Showing 27 changed files with 2,556 additions and 289 deletions.
144 changes: 115 additions & 29 deletions Cargo.lock

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

12 changes: 7 additions & 5 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,11 @@ indexmap = "2.0.0"
prettyplease = "0.2.20"
syn = { version = "2.0", features = ["printing"] }

wasmparser = "0.219.0"
wasm-encoder = "0.219.0"
wasm-metadata = "0.219.0"
wit-parser = "0.219.0"
wit-component = "0.219.0"
wasmparser = { git = "https://github.com/dicej/wasm-tools", branch = "async" }
wasm-encoder = { git = "https://github.com/dicej/wasm-tools", branch = "async" }
wasm-metadata = { git = "https://github.com/dicej/wasm-tools", branch = "async" }
wit-parser = { git = "https://github.com/dicej/wasm-tools", branch = "async" }
wit-component = { git = "https://github.com/dicej/wasm-tools", branch = "async" }

wit-bindgen-core = { path = 'crates/core', version = '0.34.0' }
wit-bindgen-c = { path = 'crates/c', version = '0.34.0' }
Expand Down Expand Up @@ -74,6 +74,7 @@ default = [
'go',
'csharp',
'moonbit',
'async',
]
c = ['dep:wit-bindgen-c']
rust = ['dep:wit-bindgen-rust']
Expand All @@ -83,6 +84,7 @@ go = ['dep:wit-bindgen-go']
csharp = ['dep:wit-bindgen-csharp']
csharp-mono = ['csharp']
moonbit = ['dep:wit-bindgen-moonbit']
async = ["wit-bindgen-rust/async"]

[dev-dependencies]
heck = { workspace = true }
Expand Down
Loading

0 comments on commit 8ebfc1e

Please sign in to comment.