From 4081945410591ef674dbc00cca61363189838608 Mon Sep 17 00:00:00 2001 From: Ryan Levick Date: Mon, 13 May 2024 14:06:27 +0200 Subject: [PATCH 1/2] Add basic example of wac CLI and programatic API Signed-off-by: Ryan Levick --- Cargo.lock | 7 ++++ Cargo.toml | 8 ++++- examples/README.md | 55 +++++++++++++++++++++++++++++ examples/deps/example/greeter.wasm | Bin 0 -> 58215 bytes examples/deps/example/hello.wasm | Bin 0 -> 39424 bytes examples/programmatic/Cargo.toml | 7 ++++ examples/programmatic/src/main.rs | 46 ++++++++++++++++++++++++ examples/script.wac | 13 +++++++ 8 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 examples/README.md create mode 100644 examples/deps/example/greeter.wasm create mode 100644 examples/deps/example/hello.wasm create mode 100644 examples/programmatic/Cargo.toml create mode 100644 examples/programmatic/src/main.rs create mode 100644 examples/script.wac diff --git a/Cargo.lock b/Cargo.lock index 3e12d94f..3738ff78 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2497,6 +2497,13 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "programmatic-example" +version = "0.1.0" +dependencies = [ + "wac-graph", +] + [[package]] name = "prost" version = "0.12.3" diff --git a/Cargo.toml b/Cargo.toml index cafdad15..51a0e4d3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -45,6 +45,9 @@ wat = ["wac-resolver/wat"] wit = ["wac-resolver/wit"] registry = ["wac-resolver/registry", "indicatif"] +[workspace] +members = ["examples/programmatic"] + [workspace.dependencies] wac-parser = { path = "crates/wac-parser", version = "0.1.0", default-features = false } wac-resolver = { path = "crates/wac-resolver", version = "0.1.0", default-features = false } @@ -61,7 +64,10 @@ clap = { version = "4.5.4", features = ["derive"] } semver = { version = "1.0.22", features = ["serde"] } pretty_env_logger = "0.5.0" log = "0.4.21" -tokio = { version = "1.37.0", default-features = false, features = ["macros", "rt-multi-thread"] } +tokio = { version = "1.37.0", default-features = false, features = [ + "macros", + "rt-multi-thread", +] } owo-colors = { version = "4.0.0", features = ["supports-colors"] } indexmap = { version = "2.2.6", features = ["serde"] } id-arena = "2.2.1" diff --git a/examples/README.md b/examples/README.md new file mode 100644 index 00000000..c7d93b1c --- /dev/null +++ b/examples/README.md @@ -0,0 +1,55 @@ +# Examples + +This example is composed of two different but equal ways for composing two example components together +* using the `wac` CLI +* using the `wac-graph` library crate + +The example uses two input components (both located in the `deps` directory) that will be composed together: + +The `hello` component exports a function `hello` which returns a string: + +```bash +# Print the wit for the hello component +$ wasm-tools component wit deps/example/hello.wasm +package root:component; + +world root { + export hello: func() -> string; +} +``` + +The `hello` exported function from `hello.wasm` will be plugged into the `hello` import of the `greeter` component which has the same signature as the `hello` exported function: + +```bash +# Print the wit for the greeter component +$ wasm-tools component wit deps/example/greeter.wasm +package root:component; + +world root { + import hello: func() -> string; + + export greet: func() -> string; +} +``` + +The resulting composed component will therefore only have the exported `greet` function originally from the `greeter` component. + +## CLI + +`wac` can be used as a CLI tool. The `wac encode` command takes a wac script as input which defines how two components are composed together. + +Running the following command should produce a new component that is the composition of the `hello` and `greeter` components. + +``` +wac encode composition.wac -o composed.wasm +``` + +*Note*: `wac encode` expects to find any input components inside of a `deps` folder in a directory named after the namespace part of the input component's name. In our example, the wac script uses the `example:greeter` and `example:hello` input components so `wac encode` expects to find those components in the `deps/example` directory. + +## Programmatic Graph API + +You can also build the composition using the programmatic API used by the `programmatic` example binary. This can be done by running the following inside the `programmatic` directory: + +``` +$ cargo run +``` diff --git a/examples/deps/example/greeter.wasm b/examples/deps/example/greeter.wasm new file mode 100644 index 0000000000000000000000000000000000000000..dfe64ab653053e8d324cf92a9894758da1535644 GIT binary patch literal 58215 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 Date: Tue, 14 May 2024 18:15:55 +0200 Subject: [PATCH 2/2] PR feedback Signed-off-by: Ryan Levick --- examples/README.md | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/examples/README.md b/examples/README.md index c7d93b1c..b3c6777a 100644 --- a/examples/README.md +++ b/examples/README.md @@ -1,7 +1,7 @@ # Examples -This example is composed of two different but equal ways for composing two example components together -* using the `wac` CLI +This example is composed of three different but equal ways for composing two example components together +* two ways using the `wac` CLI * using the `wac-graph` library crate The example uses two input components (both located in the `deps` directory) that will be composed together: @@ -34,22 +34,32 @@ world root { The resulting composed component will therefore only have the exported `greet` function originally from the `greeter` component. -## CLI +## `wac encode` `wac` can be used as a CLI tool. The `wac encode` command takes a wac script as input which defines how two components are composed together. Running the following command should produce a new component that is the composition of the `hello` and `greeter` components. +```bash +wac encode script.wac -o composed.wasm ``` -wac encode composition.wac -o composed.wasm -``` -*Note*: `wac encode` expects to find any input components inside of a `deps` folder in a directory named after the namespace part of the input component's name. In our example, the wac script uses the `example:greeter` and `example:hello` input components so `wac encode` expects to find those components in the `deps/example` directory. +*Note*: `wac encode` expects to find any input components inside of a `deps` folder in a directory named after the namespace part of the input component's name (however, this is configurable with the `--deps-dir` option). In our example, the wac script uses the `example:greeter` and `example:hello` input components so `wac encode` expects to find those components in the `deps/example` directory. + +## `wac plug` + +`wac` also comes with an opinionated CLI option called `wac plug` which will "plug" the exports of one component (the "plug") into equivalently named imports of another component (the "socket"). + +In this example, we can do this with the following invocation: + +```bash +wac plug --plug deps/example/hello.wasm deps/example/greeter.wasm -o composed.wasm +``` ## Programmatic Graph API You can also build the composition using the programmatic API used by the `programmatic` example binary. This can be done by running the following inside the `programmatic` directory: -``` -$ cargo run +```bash +cargo run ```