Imports & exports

A Wasm module can import and export entities, like functions, memories, globals and tables. This example illustrates the basics of using these entities.

In this example we'll be using a sample Wasm module which exports some entities and requires us to also import some of them.

The goal here is to give you an idea of how to work with imports and exports. We won't go into the details of each entities, they'll be covered in more details in the other examples.

First we are going to want to initialize a new project. To do this we can navigate to our project folder, or create one. In this example, we will create a new project. Lets create it and navigate to it:

The final code for this example can be found on GitHub.

Please take a look at the setup steps for Rust.

cargo new imports-exports
cd imports-exports

This should generate two important files for us, Cargo.toml and src/main.rs. The Cargo.toml is a file that describes your project and its dependencies. The src/main.rs is the entry point for your project, and contains the fn main() { .. } that is run when the project is executed.

We then modify the Cargo.toml to add the Wasmer dependencies as shown below:

[package]
name = "imports-exports"
version = "0.1.0"
authors = ["The Wasmer Engineering Team <engineering@wasmer.io>"]
edition = "2018"

[dependencies]
# The Wasmer API
wasmer = "1.0.0-alpha5"

Now that we have everything set up, let's go ahead and try it out!

Declaring imports

When a Wasm modules declares imports you will have to make them available before you can instantiate the module. Our first task will be to create the required entities.

The module we are using needs two imports:

  • A function named host_function in a namespace with an empty name;

  • A global named host_global in the env namespace.

Let's create the import object:

let import_object = imports! {
    "" => {
        "host_function" => host_function,
    },
    "env" => {
        "host_global" => host_global,
    }
}

Now that we have our import object ready, we'll need to use it when instantiating the module:

let instance = Instance::new(&module, &import_object)?;

That's it! Easy right?

We did not go into the details of how to create the imported entities, we encourage you to read other examples to know more about this:

Exposing host functions

Fetching exports

Let's have a look at our module again: it exports some entities for us in our host program:

  • A function named guest_function;

  • A global name guest_global;

  • A table name guest_table;

  • A memory named guest_memory.

To get these entities we'll use the exports API:

TODO: Write this section

Again, we'll not cover how to use these entities here as this is the topic of other, more detailed, examples:

Calling guest functionsExposing host functionsUsing exported globalsInteracting with memory

Running

We now have everything we need to run the Wasm module, let's do it!

You should be able to run it using the cargo run command. The output should look like this:

TODO: Write this section

Last updated