use crate::{io::WasmValTypeList, FuncType, WasmEdgeResult};
use sys::r#async::{
function::{AsyncFn, AsyncFunction},
module::AsyncImportObject,
};
use wasmedge_sys::{self as sys};
#[derive(Debug)]
pub struct ImportObjectBuilder<Data: Send> {
import_object: AsyncImportObject<Data>,
}
impl<Data: Send> ImportObjectBuilder<Data> {
pub fn new(name: impl AsRef<str>, data: Data) -> WasmEdgeResult<Self> {
let import_object = AsyncImportObject::create(name, Box::new(data))?;
Ok(Self { import_object })
}
pub fn with_func<Args, Rets>(
&mut self,
name: impl AsRef<str>,
real_func: AsyncFn<Data>,
) -> WasmEdgeResult<&mut Self>
where
Args: WasmValTypeList,
Rets: WasmValTypeList,
{
let args = Args::wasm_types();
let returns = Rets::wasm_types();
let ty = FuncType::new(args.to_vec(), returns.to_vec());
let func = AsyncFunction::create_async_func(
&ty,
real_func,
self.import_object.get_host_data_mut(),
0,
)?;
self.import_object.add_async_func(name, func);
Ok(self)
}
pub fn with_func_by_type(
&mut self,
name: impl AsRef<str>,
ty: FuncType,
real_func: AsyncFn<Data>,
) -> WasmEdgeResult<&mut Self> {
let func = AsyncFunction::create_async_func(
&ty,
real_func,
self.import_object.get_host_data_mut(),
0,
)?;
self.import_object.add_async_func(name, func);
Ok(self)
}
pub fn with_global(mut self, name: impl AsRef<str>, global: sys::Global) -> Self {
self.import_object.add_global(name, global);
self
}
pub fn with_memory(mut self, name: impl AsRef<str>, memory: sys::Memory) -> Self {
self.import_object.add_memory(name, memory);
self
}
pub fn with_table(mut self, name: impl AsRef<str>, table: sys::Table) -> Self {
self.import_object.add_table(name, table);
self
}
pub fn build(self) -> ImportObject<Data> {
self.import_object
}
}
pub type ImportObject<T> = sys::r#async::module::AsyncImportObject<T>;