use std::collections::HashMap;
use std::path::PathBuf;
use anyhow::{Context, Result};
use splicer::{compose, ComponentInput, ComposeRequest};
use wac_graph::EncodeOptions;
use wac_parser::Document;
use wac_resolver::{packages, FileSystemPackageResolver};
const WAT_PROVIDER_A: &str = r#"(component
(import "host:env/dep@0.1.0" (instance $dep
(export "get" (func (result u32)))
))
(alias export $dep "get" (func $f))
(instance $out (export "get" (func $f)))
(export "my:providers/a@0.1.0" (instance $out))
)"#;
const WAT_CONSUMER: &str = r#"(component
(import "my:providers/a@0.1.0" (instance $a
(export "get" (func (result u32)))
))
(alias export $a "get" (func $f))
(instance $out (export "get" (func $f)))
(export "my:consumer/app@0.1.0" (instance $out))
)"#;
fn main() -> Result<()> {
let tmp = tempfile::tempdir().context("create temp dir")?;
let provider_path = tmp.path().join("provider-a.wasm");
let consumer_path = tmp.path().join("consumer.wasm");
let provider_bytes = wat::parse_str(WAT_PROVIDER_A).context("compile provider WAT")?;
let consumer_bytes = wat::parse_str(WAT_CONSUMER).context("compile consumer WAT")?;
std::fs::write(&provider_path, &provider_bytes).context("write provider wasm")?;
std::fs::write(&consumer_path, &consumer_bytes).context("write consumer wasm")?;
println!(
"✓ wrote provider and consumer wasm to {}",
tmp.path().display()
);
let out = compose(ComposeRequest {
components: vec![
ComponentInput {
alias: Some("provider-a".to_string()),
path: provider_path.clone(),
},
ComponentInput {
alias: Some("consumer".to_string()),
path: consumer_path.clone(),
},
],
package_name: "example:composition".to_string(),
})?;
println!(
"✓ splicer::compose produced {} bytes of WAC source",
out.wac.len()
);
println!(" wac_deps:");
for (key, path) in &out.wac_deps {
println!(" {key} = {}", path.display());
}
let doc = Document::parse(&out.wac).context("parse WAC source")?;
println!("✓ wac_parser::Document::parse succeeded");
let keys = packages(&doc).context("discover packages from WAC")?;
println!(
"✓ wac_resolver::packages found {} package reference(s)",
keys.len()
);
let overrides: HashMap<String, PathBuf> = out.wac_deps.into_iter().collect();
let resolver = FileSystemPackageResolver::new(tmp.path(), overrides, true);
let pkgs = resolver
.resolve(&keys)
.context("resolve package keys against splicer's wac_deps")?;
println!("✓ FileSystemPackageResolver::resolve succeeded");
let resolution = doc.resolve(pkgs).context("resolve WAC document")?;
let composed: Vec<u8> = resolution
.encode(EncodeOptions::default())
.context("encode composed component")?;
println!(
"✓ resolution.encode produced {} bytes of composed wasm",
composed.len()
);
let mut validator = wasmparser::Validator::new_with_features(wasmparser::WasmFeatures::all());
validator
.validate_all(&composed)
.context("validate composed component bytes")?;
println!("✓ wasmparser validated the composed component");
println!();
println!("All done — splicer's output drove the wac crates end-to-end.");
Ok(())
}