bytecodealliance / bytecodealliance/wasmtime

Satisfying imports for `wasmtime::component::bindgen!`

Open
#8,426 2 comments 1 reaction 0 assignees View on GitHub
Dominant language
Rust
Stars
18.6k
Forks
1.8k
Avg merge
1d 18h
Merged PRs (30d)
126

Description

Hi, I'm fairly new to all of this. If there's someplace else I should be going, please let me know. Thanks!

I'm trying to use `bindgen!` with a simple hello world WASM Component Model. I've built a simple one using:

```
$ cargo component new --lib hello
$ cd hello
$ cargo component build
```

The generated wit looks like the following:

```
package root:component;

world root {
import wasi:cli/environment@0.2.0;
import wasi:cli/exit@0.2.0;
import wasi:io/error@0.2.0;
import wasi:io/streams@0.2.0;
import wasi:cli/stdin@0.2.0;
import wasi:cli/stdout@0.2.0;
import wasi:cli/stderr@0.2.0;
import wasi:clocks/wall-clock@0.2.0;
import wasi:filesystem/types@0.2.0;
import wasi:filesystem/preopens@0.2.0;

export hello: func() -> string;
}
```

When I manually use `add_to_linker` I can get it to work:

```rust
use std::error::Error;
use wasmtime::{
component::{Component, Linker},
{Config, Engine, Store},
};
use wasmtime_wasi::{
bindings, {WasiCtxBuilder, WasiP1Ctx},
};

fn main() -> Result<(), Box> {
let engine = Engine::new(Config::new().wasm_component_model(true))?;

let component = Component::from_file(&engine, "hello.wasm")?;

let mut linker = Linker::::new(&engine);
bindings::cli::environment::add_to_linker(&mut linker, |x| x)?;
bindings::wasi::cli::exit::add_to_linker(&mut linker, |x| x)?;
bindings::wasi::io::error::add_to_linker(&mut linker, |x| x)?;
bindings::sync_io::io::streams::add_to_linker(&mut linker, |x| x)?;
bindings::wasi::cli::stdin::add_to_linker(&mut linker, |x| x)?;
bindings::wasi::cli::stdout::add_to_linker(&mut linker, |x| x)?;
bindings::wasi::cli::stderr::add_to_linker(&mut linker, |x| x)?;
bindings::sync_io::filesystem::types::add_to_linker(&mut linker, |x| x)?;
bindings::wasi::filesystem::preopens::add_to_linker(&mut linker, |x| x)?;

let wasi_ctx = WasiCtxBuilder::new().build_p1();
let mut store = Store::new(&engine, wasi_ctx);

let instance = linker.instantiate(&mut store, &component)?;

let func = instance
.get_func(&mut store, "hello")
.expect("hello export not found");
let mut result = [wasmtime::component::Val::String("".into())];
func.call(&mut store, &[], &mut result)?;

println!("{:?}", result);

Ok(())
}
```

I'm trying to follow the documentation on using `wasmtime::components::bindgen!`:

```rust
wasmtime::component::bindgen!({
with: {
"wasi:cli/environment@0.2.0": wasmtime_wasi::bindings::wasi::cli::environment,
"wasi": "wasmtime_wasi::bindings",
},
});
```

I can't seem to get around this error:
```
error: failed to resolve directory while parsing WIT for path [/home/hone/Projects/rust/wasm/wasmtime_component_hello/wit]

Caused by:
package not found
--> /home/hone/Projects/rust/wasm/wasmtime_component_hello/wit/hello.wit:4:10
|
4 | import wasi:cli/environment@0.2.0;
| ^-------
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.