Stream: git-wasmtime

Topic: wasmtime / issue #8426 Using satisfying imports for `wasm...


view this post on Zulip Wasmtime GitHub notifications bot (Apr 21 2024 at 19:05):

hone opened issue #8426:

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:

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

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

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

    let mut linker = Linker::<WasiP1Ctx>::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!:

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;
                 |          ^-------


Last updated: Dec 23 2024 at 13:07 UTC