use std::sync::Arc; use dagger_sdk::HostDirectoryOptsBuilder; #[tokio::main] async fn main() -> eyre::Result<()> { color_eyre::install().unwrap(); let client = dagger_sdk::connect().await?; let wasm = build_wasm_binary(client.clone()).await?; run_wasmtime(client.clone(), wasm.clone()).await?; run_wasmer(client, wasm).await?; Ok(()) } async fn build_wasm_binary(client: Arc) -> eyre::Result { let target = "wasm32-wasi"; let binary = "dagger-wasm.wasm"; let cargo_cache = client.cache_volume("cargo_cache"); let src = client.host().directory_opts( ".", HostDirectoryOptsBuilder::default() .include(vec!["Cargo.toml", "Cargo.lock", "src/"]) .build()?, ); let wasm = client .container() .from("rustlang/rust:nightly") .with_mounted_cache("~/.cargo", cargo_cache.id().await?) .with_exec(vec!["rustup", "target", "add", target]) .with_directory("/app", src.id().await?) .with_workdir("/app") .with_exec(vec![ "cargo", "build", format!("--target={target}").as_str(), "--release", ]) .file(format!("target/{target}/release/{binary}")); Ok(wasm) } async fn run_wasmtime(client: Arc, wasm: dagger_sdk::File) -> eyre::Result<()> { let wasmtime_version = "v8.0.1"; let wasmtime_architecture = "aarch64"; let wasmtime_download_url = format!("https://github.com/bytecodealliance/wasmtime/releases/download/{wasmtime_version}/wasmtime-{wasmtime_version}-{wasmtime_architecture}-linux.tar.xz"); let debian = build_debian(client).await?; let out = debian .with_exec(vec![ "wget", &wasmtime_download_url, "-O", "wasmtime.tar.xz", ]) .with_exec(vec!["tar", "-xvf", "wasmtime.tar.xz"]) .with_exec(vec![ "mv", &format!("wasmtime-{wasmtime_version}-{wasmtime_architecture}-linux/wasmtime"), "/usr/bin/wasmtime", ]) .with_exec(vec!["wasmtime", "-V"]) .with_file("/usr/lib/dagger-wasm.wasm", wasm.id().await?) .with_exec(vec!["wasmtime", "/usr/lib/dagger-wasm.wasm"]); let out = out.stdout().await?; println!("wasmtime: {}", out); Ok(()) } async fn run_wasmer(client: Arc, wasm: dagger_sdk::File) -> eyre::Result<()> { let wasmer_version = "v3.3.0"; let wasmer_architecture = "aarch64"; let wasmer_download_url = format!("https://github.com/wasmerio/wasmer/releases/download/{wasmer_version}/wasmer-linux-{wasmer_architecture}.tar.gz"); let debian = build_debian(client).await?; let out = debian .with_exec(vec!["wget", &wasmer_download_url, "-O", "wasmer.tar.gz"]) .with_exec(vec!["tar", "-xvf", "wasmer.tar.gz"]) .with_exec(vec!["mv", "bin/wasmer", "/usr/bin/wasmer"]) .with_exec(vec!["wasmer", "-v"]) .with_file("/usr/lib/dagger-wasm.wasm", wasm.id().await?) .with_exec(vec!["wasmer", "run", "/usr/lib/dagger-wasm.wasm"]); let out = out.stdout().await?; println!("wasmer: {}", out); Ok(()) } async fn build_debian(client: Arc) -> eyre::Result { let debian = client .container() .from("debian:bookworm") .with_workdir("/tmp/") .with_exec(vec!["apt", "update", "-y"]) .with_exec(vec!["apt", "install", "wget", "xz-utils", "-y"]); Ok(debian) }