use anyhow::*;
use wasm_component_layer::*;
const WASM: &[u8] = include_bytes!("resource/component.wasm");
pub fn main() {
let engine = Engine::new(wasmi_runtime_layer::Engine::default());
let mut store = Store::new(&engine, ());
let resource_ty = ResourceType::new::<MyResource>(None);
let resource_ty_clone = resource_ty.clone();
let resource_constructor = Func::new(
&mut store,
FuncType::new([ValueType::S32], [ValueType::Own(resource_ty.clone())]),
move |ctx, args, results| {
let Value::S32(a) = args[0] else {
bail!("Incorrect input type.")
};
results[0] = Value::Own(ResourceOwn::new(
ctx,
MyResource(a),
resource_ty_clone.clone(),
)?);
Ok(())
},
);
let resource_print = Func::new(
&mut store,
FuncType::new([ValueType::Borrow(resource_ty.clone())], []),
|ctx, args, _| {
let Value::Borrow(res) = &args[0] else {
bail!("Incorrect input type.")
};
println!(
"Called print with value {:?}",
res.rep::<MyResource, _, _>(&ctx.as_context()).unwrap()
);
Ok(())
},
);
let component = Component::new(&engine, WASM).unwrap();
let mut linker = Linker::default();
let resource_interface = linker
.define_instance("test:guest/bar".try_into().unwrap())
.unwrap();
resource_interface
.define_resource("myresource", resource_ty)
.unwrap();
resource_interface
.define_func("[constructor]myresource", resource_constructor)
.unwrap();
resource_interface
.define_func("[method]myresource.print-a", resource_print)
.unwrap();
let instance = linker.instantiate(&mut store, &component).unwrap();
let interface = instance
.exports()
.instance(&"test:guest/foo".try_into().unwrap())
.unwrap();
let use_resource = interface
.func("use-resource")
.unwrap()
.typed::<(), ()>()
.unwrap();
use_resource.call(&mut store, ()).unwrap();
}
#[derive(Debug)]
pub struct MyResource(pub i32);