Stream: git-wasmtime

Topic: wasmtime / issue #9589 Rust docs incorrectly specify how ...


view this post on Zulip Wasmtime GitHub notifications bot (Nov 09 2024 at 22:43):

danthegoodman1 opened issue #9589:

At https://docs.rs/wasmtime/26.0.1/wasmtime/component/struct.Func.html the following example is shown:

Calling a function which takes one string parameter and returns a string:
rs let typed = func.typed::<(&str,), (String,)>(&store)?; let ret = typed.call(&mut store, ("Hello, ",))?.0; println!("returned string was: {}", ret);

I have recreated this setup via:

lib.rs

use wasm_bindgen::prelude::*;

#[wasm_bindgen]
pub fn uppercase(input: &str) -> String {
    input.to_uppercase()
}

Compiled with wasm-pack build --target web

main.rs (another directory)

use wasmtime::*;

fn main() -> Result<()> {
    let wasm_bytes = std::fs::read("/Users/dangoodman/code/learningRust/wasm/code/pkg/code_bg.wasm")?;
    let engine = Engine::default();
    let mut store = Store::new(&engine, ());
    let uppercase = instance.get_func(&mut store, "uppercase").unwrap();
    let upper_typed = uppercase.typed::<(&str,), (String,)>(&store)?;

Which gives me the following error:

   Compiling host v0.1.0 (/Users/dangoodman/code/learningRust/wasm/host)
error[E0277]: the trait bound `(&str,): WasmParams` is not satisfied
    --> src/main.rs:27:41
     |
27   |     let upper_typed = uppercase.typed::<(&str,), (String,)>(&store)?;
     |                                 -----   ^^^^^^^ the trait `WasmParams` is not implemented for `(&str,)`
     |                                 |
     |                                 required by a bound introduced by this call
     |
     = help: the following other types implement trait `WasmParams`:
               ()
               (A1, A2)
               (A1, A2, A3)
               (A1, A2, A3, A4)
               (A1, A2, A3, A4, A5)
               (A1, A2, A3, A4, A5, A6)
               (A1, A2, A3, A4, A5, A6, A7)
               (A1, A2, A3, A4, A5, A6, A7, A8)
             and 10 others
note: required by a bound in `wasmtime::Func::typed`
    --> /Users/dangoodman/.cargo/registry/src/index.crates.io-6f17d22bba15001f/wasmtime-26.0.1/src/runtime/func.rs:1563:17
     |
1558 |     pub fn typed<Params, Results>(
     |            ----- required by a bound in this associated function
...
1563 |         Params: WasmParams,
     |                 ^^^^^^^^^^ required by this bound in `Func::typed`

error[E0277]: the trait bound `(std::string::String,): WasmResults` is not satisfied
    --> src/main.rs:27:50
     |
27   |     let upper_typed = uppercase.typed::<(&str,), (String,)>(&store)?;
     |                                 -----            ^^^^^^^^^ the trait `WasmResults` is not implemented for `(std::string::String,)`
     |                                 |
     |                                 required by a bound introduced by this call
     |
     = help: the following other types implement trait `WasmResults`:
               ()
               (A1, A2)
               (A1, A2, A3)
               (A1, A2, A3, A4)
               (A1, A2, A3, A4, A5)
               (A1, A2, A3, A4, A5, A6)
               (A1, A2, A3, A4, A5, A6, A7)
               (A1, A2, A3, A4, A5, A6, A7, A8)
             and 10 others
note: required by a bound in `wasmtime::Func::typed`
    --> /Users/dangoodman/.cargo/registry/src/index.crates.io-6f17d22bba15001f/wasmtime-26.0.1/src/runtime/func.rs:1564:18
     |
1558 |     pub fn typed<Params, Results>(
     |            ----- required by a bound in this associated function
...
1564 |         Results: WasmResults,
     |                  ^^^^^^^^^^^ required by this bound in `Func::typed`

For more information about this error, try `rustc --explain E0277`.
error: could not compile `host` (bin "host") due to 2 previous errors

Is the example wrong, or am I using the crate incorrectly?

The docs state:

Types specified here must implement the ComponentType trait. This trait is implemented for built-in types to Rust such as integer primitives, floats, Option<T>, Result<T, E>, strings, Vec<T>, and more. As parameters you’ll be passing native Rust types.

And the trait for these types seem to be implemented according to https://docs.rs/wasmtime/26.0.1/wasmtime/component/trait.ComponentType.html

It's being imported as wasmtime = { version = "26.0.1", features = ["component-model", "runtime"] }

view this post on Zulip Wasmtime GitHub notifications bot (Nov 09 2024 at 22:45):

danthegoodman1 edited issue #9589:

At https://docs.rs/wasmtime/26.0.1/wasmtime/component/struct.Func.html the following example is shown:

Calling a function which takes one string parameter and returns a string:
rs let typed = func.typed::<(&str,), (String,)>(&store)?; let ret = typed.call(&mut store, ("Hello, ",))?.0; println!("returned string was: {}", ret);

I have recreated this setup via:

lib.rs

use wasm_bindgen::prelude::*;

#[wasm_bindgen]
pub fn uppercase(input: &str) -> String {
    input.to_uppercase()
}

Compiled with wasm-pack build --target web

main.rs (another directory)

use wasmtime::*;

fn main() -> Result<()> {
    let wasm_bytes = std::fs::read("/Users/dangoodman/code/learningRust/wasm/code/pkg/code_bg.wasm")?;
    let engine = Engine::default();
    let mut store = Store::new(&engine, ());
    let uppercase = instance.get_func(&mut store, "uppercase").unwrap();
    let upper_typed = uppercase.typed::<(&str,), (String,)>(&store)?;

Which gives me the following error:

   Compiling host v0.1.0 (/Users/dangoodman/code/learningRust/wasm/host)
error[E0277]: the trait bound `(&str,): WasmParams` is not satisfied
    --> src/main.rs:27:41
     |
27   |     let upper_typed = uppercase.typed::<(&str,), (String,)>(&store)?;
     |                                 -----   ^^^^^^^ the trait `WasmParams` is not implemented for `(&str,)`
     |                                 |
     |                                 required by a bound introduced by this call
     |
     = help: the following other types implement trait `WasmParams`:
               ()
               (A1, A2)
               (A1, A2, A3)
               (A1, A2, A3, A4)
               (A1, A2, A3, A4, A5)
               (A1, A2, A3, A4, A5, A6)
               (A1, A2, A3, A4, A5, A6, A7)
               (A1, A2, A3, A4, A5, A6, A7, A8)
             and 10 others
note: required by a bound in `wasmtime::Func::typed`
    --> /Users/dangoodman/.cargo/registry/src/index.crates.io-6f17d22bba15001f/wasmtime-26.0.1/src/runtime/func.rs:1563:17
     |
1558 |     pub fn typed<Params, Results>(
     |            ----- required by a bound in this associated function
...
1563 |         Params: WasmParams,
     |                 ^^^^^^^^^^ required by this bound in `Func::typed`

error[E0277]: the trait bound `(std::string::String,): WasmResults` is not satisfied
    --> src/main.rs:27:50
     |
27   |     let upper_typed = uppercase.typed::<(&str,), (String,)>(&store)?;
     |                                 -----            ^^^^^^^^^ the trait `WasmResults` is not implemented for `(std::string::String,)`
     |                                 |
     |                                 required by a bound introduced by this call
     |
     = help: the following other types implement trait `WasmResults`:
               ()
               (A1, A2)
               (A1, A2, A3)
               (A1, A2, A3, A4)
               (A1, A2, A3, A4, A5)
               (A1, A2, A3, A4, A5, A6)
               (A1, A2, A3, A4, A5, A6, A7)
               (A1, A2, A3, A4, A5, A6, A7, A8)
             and 10 others
note: required by a bound in `wasmtime::Func::typed`
    --> /Users/dangoodman/.cargo/registry/src/index.crates.io-6f17d22bba15001f/wasmtime-26.0.1/src/runtime/func.rs:1564:18
     |
1558 |     pub fn typed<Params, Results>(
     |            ----- required by a bound in this associated function
...
1564 |         Results: WasmResults,
     |                  ^^^^^^^^^^^ required by this bound in `Func::typed`

For more information about this error, try `rustc --explain E0277`.
error: could not compile `host` (bin "host") due to 2 previous errors

Is the example wrong, or am I using the crate incorrectly?

The docs state:

Types specified here must implement the ComponentType trait. This trait is implemented for built-in types to Rust such as integer primitives, floats, Option<T>, Result<T, E>, strings, Vec<T>, and more. As parameters you’ll be passing native Rust types.

And the trait for these types seem to be implemented according to https://docs.rs/wasmtime/26.0.1/wasmtime/component/trait.ComponentType.html

It's being imported as wasmtime = { version = "26.0.1", features = ["component-model", "runtime"] }

Edit: it also seems to have a similar issue for calling the function:

<img width="1168" alt="image" src="https://github.com/user-attachments/assets/062b378c-e8d9-4999-8a12-c195088b5b8f">

view this post on Zulip Wasmtime GitHub notifications bot (Nov 09 2024 at 22:45):

danthegoodman1 edited issue #9589:

At https://docs.rs/wasmtime/26.0.1/wasmtime/component/struct.Func.html the following example is shown:

Calling a function which takes one string parameter and returns a string:
rs let typed = func.typed::<(&str,), (String,)>(&store)?; let ret = typed.call(&mut store, ("Hello, ",))?.0; println!("returned string was: {}", ret);

I have recreated this setup via:

lib.rs

use wasm_bindgen::prelude::*;

#[wasm_bindgen]
pub fn uppercase(input: &str) -> String {
    input.to_uppercase()
}

Compiled with wasm-pack build --target web

main.rs (another directory)

use wasmtime::*;

fn main() -> Result<()> {
    let wasm_bytes = std::fs::read("/Users/dangoodman/code/learningRust/wasm/code/pkg/code_bg.wasm")?;
    let engine = Engine::default();
    let mut store = Store::new(&engine, ());
    let uppercase = instance.get_func(&mut store, "uppercase").unwrap();
    let upper_typed = uppercase.typed::<(&str,), (String,)>(&store)?;

Which gives me the following error:

   Compiling host v0.1.0 (/Users/dangoodman/code/learningRust/wasm/host)
error[E0277]: the trait bound `(&str,): WasmParams` is not satisfied
    --> src/main.rs:27:41
     |
27   |     let upper_typed = uppercase.typed::<(&str,), (String,)>(&store)?;
     |                                 -----   ^^^^^^^ the trait `WasmParams` is not implemented for `(&str,)`
     |                                 |
     |                                 required by a bound introduced by this call
     |
     = help: the following other types implement trait `WasmParams`:
               ()
               (A1, A2)
               (A1, A2, A3)
               (A1, A2, A3, A4)
               (A1, A2, A3, A4, A5)
               (A1, A2, A3, A4, A5, A6)
               (A1, A2, A3, A4, A5, A6, A7)
               (A1, A2, A3, A4, A5, A6, A7, A8)
             and 10 others
note: required by a bound in `wasmtime::Func::typed`
    --> /Users/dangoodman/.cargo/registry/src/index.crates.io-6f17d22bba15001f/wasmtime-26.0.1/src/runtime/func.rs:1563:17
     |
1558 |     pub fn typed<Params, Results>(
     |            ----- required by a bound in this associated function
...
1563 |         Params: WasmParams,
     |                 ^^^^^^^^^^ required by this bound in `Func::typed`

error[E0277]: the trait bound `(std::string::String,): WasmResults` is not satisfied
    --> src/main.rs:27:50
     |
27   |     let upper_typed = uppercase.typed::<(&str,), (String,)>(&store)?;
     |                                 -----            ^^^^^^^^^ the trait `WasmResults` is not implemented for `(std::string::String,)`
     |                                 |
     |                                 required by a bound introduced by this call
     |
     = help: the following other types implement trait `WasmResults`:
               ()
               (A1, A2)
               (A1, A2, A3)
               (A1, A2, A3, A4)
               (A1, A2, A3, A4, A5)
               (A1, A2, A3, A4, A5, A6)
               (A1, A2, A3, A4, A5, A6, A7)
               (A1, A2, A3, A4, A5, A6, A7, A8)
             and 10 others
note: required by a bound in `wasmtime::Func::typed`
    --> /Users/dangoodman/.cargo/registry/src/index.crates.io-6f17d22bba15001f/wasmtime-26.0.1/src/runtime/func.rs:1564:18
     |
1558 |     pub fn typed<Params, Results>(
     |            ----- required by a bound in this associated function
...
1564 |         Results: WasmResults,
     |                  ^^^^^^^^^^^ required by this bound in `Func::typed`

For more information about this error, try `rustc --explain E0277`.
error: could not compile `host` (bin "host") due to 2 previous errors

Is the example wrong, or am I using the crate incorrectly?

The docs state:

Types specified here must implement the ComponentType trait. This trait is implemented for built-in types to Rust such as integer primitives, floats, Option<T>, Result<T, E>, strings, Vec<T>, and more. As parameters you’ll be passing native Rust types.

And the trait for these types seem to be implemented according to https://docs.rs/wasmtime/26.0.1/wasmtime/component/trait.ComponentType.html

It's being imported as wasmtime = { version = "26.0.1", features = ["component-model", "runtime"] }

Edit: it also seems to have a similar issue for calling the function:

<img width="1168" alt="image" src="https://github.com/user-attachments/assets/062b378c-e8d9-4999-8a12-c195088b5b8f">

view this post on Zulip Wasmtime GitHub notifications bot (Nov 09 2024 at 22:45):

danthegoodman1 edited issue #9589:

At https://docs.rs/wasmtime/26.0.1/wasmtime/component/struct.Func.html the following example is shown:

Calling a function which takes one string parameter and returns a string:
rs let typed = func.typed::<(&str,), (String,)>(&store)?; let ret = typed.call(&mut store, ("Hello, ",))?.0; println!("returned string was: {}", ret);

I have recreated this setup via:

lib.rs

use wasm_bindgen::prelude::*;

#[wasm_bindgen]
pub fn uppercase(input: &str) -> String {
    input.to_uppercase()
}

Compiled with wasm-pack build --target web

main.rs (another crate)

use wasmtime::*;

fn main() -> Result<()> {
    let wasm_bytes = std::fs::read("/Users/dangoodman/code/learningRust/wasm/code/pkg/code_bg.wasm")?;
    let engine = Engine::default();
    let mut store = Store::new(&engine, ());
    let uppercase = instance.get_func(&mut store, "uppercase").unwrap();
    let upper_typed = uppercase.typed::<(&str,), (String,)>(&store)?;

Which gives me the following error:

   Compiling host v0.1.0 (/Users/dangoodman/code/learningRust/wasm/host)
error[E0277]: the trait bound `(&str,): WasmParams` is not satisfied
    --> src/main.rs:27:41
     |
27   |     let upper_typed = uppercase.typed::<(&str,), (String,)>(&store)?;
     |                                 -----   ^^^^^^^ the trait `WasmParams` is not implemented for `(&str,)`
     |                                 |
     |                                 required by a bound introduced by this call
     |
     = help: the following other types implement trait `WasmParams`:
               ()
               (A1, A2)
               (A1, A2, A3)
               (A1, A2, A3, A4)
               (A1, A2, A3, A4, A5)
               (A1, A2, A3, A4, A5, A6)
               (A1, A2, A3, A4, A5, A6, A7)
               (A1, A2, A3, A4, A5, A6, A7, A8)
             and 10 others
note: required by a bound in `wasmtime::Func::typed`
    --> /Users/dangoodman/.cargo/registry/src/index.crates.io-6f17d22bba15001f/wasmtime-26.0.1/src/runtime/func.rs:1563:17
     |
1558 |     pub fn typed<Params, Results>(
     |            ----- required by a bound in this associated function
...
1563 |         Params: WasmParams,
     |                 ^^^^^^^^^^ required by this bound in `Func::typed`

error[E0277]: the trait bound `(std::string::String,): WasmResults` is not satisfied
    --> src/main.rs:27:50
     |
27   |     let upper_typed = uppercase.typed::<(&str,), (String,)>(&store)?;
     |                                 -----            ^^^^^^^^^ the trait `WasmResults` is not implemented for `(std::string::String,)`
     |                                 |
     |                                 required by a bound introduced by this call
     |
     = help: the following other types implement trait `WasmResults`:
               ()
               (A1, A2)
               (A1, A2, A3)
               (A1, A2, A3, A4)
               (A1, A2, A3, A4, A5)
               (A1, A2, A3, A4, A5, A6)
               (A1, A2, A3, A4, A5, A6, A7)
               (A1, A2, A3, A4, A5, A6, A7, A8)
             and 10 others
note: required by a bound in `wasmtime::Func::typed`
    --> /Users/dangoodman/.cargo/registry/src/index.crates.io-6f17d22bba15001f/wasmtime-26.0.1/src/runtime/func.rs:1564:18
     |
1558 |     pub fn typed<Params, Results>(
     |            ----- required by a bound in this associated function
...
1564 |         Results: WasmResults,
     |                  ^^^^^^^^^^^ required by this bound in `Func::typed`

For more information about this error, try `rustc --explain E0277`.
error: could not compile `host` (bin "host") due to 2 previous errors

Is the example wrong, or am I using the crate incorrectly?

The docs state:

Types specified here must implement the ComponentType trait. This trait is implemented for built-in types to Rust such as integer primitives, floats, Option<T>, Result<T, E>, strings, Vec<T>, and more. As parameters you’ll be passing native Rust types.

And the trait for these types seem to be implemented according to https://docs.rs/wasmtime/26.0.1/wasmtime/component/trait.ComponentType.html

It's being imported as wasmtime = { version = "26.0.1", features = ["component-model", "runtime"] }

Edit: it also seems to have a similar issue for calling the function:

<img width="1168" alt="image" src="https://github.com/user-attachments/assets/062b378c-e8d9-4999-8a12-c195088b5b8f">

view this post on Zulip Wasmtime GitHub notifications bot (Nov 09 2024 at 22:47):

danthegoodman1 closed issue #9589:

At https://docs.rs/wasmtime/26.0.1/wasmtime/component/struct.Func.html the following example is shown:

Calling a function which takes one string parameter and returns a string:
rs let typed = func.typed::<(&str,), (String,)>(&store)?; let ret = typed.call(&mut store, ("Hello, ",))?.0; println!("returned string was: {}", ret);

I have recreated this setup via:

lib.rs

use wasm_bindgen::prelude::*;

#[wasm_bindgen]
pub fn uppercase(input: &str) -> String {
    input.to_uppercase()
}

Compiled with wasm-pack build --target web

main.rs (another crate)

use wasmtime::*;

fn main() -> Result<()> {
    let wasm_bytes = std::fs::read("/Users/dangoodman/code/learningRust/wasm/code/pkg/code_bg.wasm")?;
    let engine = Engine::default();
    let mut store = Store::new(&engine, ());
    let uppercase = instance.get_func(&mut store, "uppercase").unwrap();
    let upper_typed = uppercase.typed::<(&str,), (String,)>(&store)?;

Which gives me the following error:

   Compiling host v0.1.0 (/Users/dangoodman/code/learningRust/wasm/host)
error[E0277]: the trait bound `(&str,): WasmParams` is not satisfied
    --> src/main.rs:27:41
     |
27   |     let upper_typed = uppercase.typed::<(&str,), (String,)>(&store)?;
     |                                 -----   ^^^^^^^ the trait `WasmParams` is not implemented for `(&str,)`
     |                                 |
     |                                 required by a bound introduced by this call
     |
     = help: the following other types implement trait `WasmParams`:
               ()
               (A1, A2)
               (A1, A2, A3)
               (A1, A2, A3, A4)
               (A1, A2, A3, A4, A5)
               (A1, A2, A3, A4, A5, A6)
               (A1, A2, A3, A4, A5, A6, A7)
               (A1, A2, A3, A4, A5, A6, A7, A8)
             and 10 others
note: required by a bound in `wasmtime::Func::typed`
    --> /Users/dangoodman/.cargo/registry/src/index.crates.io-6f17d22bba15001f/wasmtime-26.0.1/src/runtime/func.rs:1563:17
     |
1558 |     pub fn typed<Params, Results>(
     |            ----- required by a bound in this associated function
...
1563 |         Params: WasmParams,
     |                 ^^^^^^^^^^ required by this bound in `Func::typed`

error[E0277]: the trait bound `(std::string::String,): WasmResults` is not satisfied
    --> src/main.rs:27:50
     |
27   |     let upper_typed = uppercase.typed::<(&str,), (String,)>(&store)?;
     |                                 -----            ^^^^^^^^^ the trait `WasmResults` is not implemented for `(std::string::String,)`
     |                                 |
     |                                 required by a bound introduced by this call
     |
     = help: the following other types implement trait `WasmResults`:
               ()
               (A1, A2)
               (A1, A2, A3)
               (A1, A2, A3, A4)
               (A1, A2, A3, A4, A5)
               (A1, A2, A3, A4, A5, A6)
               (A1, A2, A3, A4, A5, A6, A7)
               (A1, A2, A3, A4, A5, A6, A7, A8)
             and 10 others
note: required by a bound in `wasmtime::Func::typed`
    --> /Users/dangoodman/.cargo/registry/src/index.crates.io-6f17d22bba15001f/wasmtime-26.0.1/src/runtime/func.rs:1564:18
     |
1558 |     pub fn typed<Params, Results>(
     |            ----- required by a bound in this associated function
...
1564 |         Results: WasmResults,
     |                  ^^^^^^^^^^^ required by this bound in `Func::typed`

For more information about this error, try `rustc --explain E0277`.
error: could not compile `host` (bin "host") due to 2 previous errors

Is the example wrong, or am I using the crate incorrectly?

The docs state:

Types specified here must implement the ComponentType trait. This trait is implemented for built-in types to Rust such as integer primitives, floats, Option<T>, Result<T, E>, strings, Vec<T>, and more. As parameters you’ll be passing native Rust types.

And the trait for these types seem to be implemented according to https://docs.rs/wasmtime/26.0.1/wasmtime/component/trait.ComponentType.html

It's being imported as wasmtime = { version = "26.0.1", features = ["component-model", "runtime"] }

Edit: it also seems to have a similar issue for calling the function:

<img width="1168" alt="image" src="https://github.com/user-attachments/assets/062b378c-e8d9-4999-8a12-c195088b5b8f">

view this post on Zulip Wasmtime GitHub notifications bot (Nov 09 2024 at 22:47):

danthegoodman1 commented on issue #9589:

Seems I didn't use the component model for this. Wish there was a guide on that!

view this post on Zulip Wasmtime GitHub notifications bot (Dec 05 2024 at 23:22):

fitzgen commented on issue #9589:

Wish there was a guide on that!

Have you seen https://component-model.bytecodealliance.org/ ?

view this post on Zulip Wasmtime GitHub notifications bot (Dec 05 2024 at 23:31):

danthegoodman1 commented on issue #9589:

I had eventually, I think the problem is that it required I knew that ComponentModel was a totally different thing. I think the hierarchy of knowledge requirement in the wasm ecosystem can cause issues like this pretty easily, at least that was my exp. going through it


Last updated: Dec 23 2024 at 13:07 UTC