use crate::{AsInstance, Func, Global, Memory, Table, WasmEdgeResult};
use wasmedge_sys::{self as sys, AsImport, AsInstance as sys_as_instance_trait};
#[derive(Debug)]
pub struct WasiInstance {
pub(crate) inner: sys::WasiModule,
}
impl WasiInstance {
pub fn initialize(
&mut self,
args: Option<Vec<&str>>,
envs: Option<Vec<&str>>,
preopens: Option<Vec<&str>>,
) {
self.inner.init_wasi(args, envs, preopens);
}
pub fn exit_code(&self) -> u32 {
self.inner.exit_code()
}
pub fn native_handler(&self, fd: i32) -> WasmEdgeResult<u64> {
self.inner.get_native_handler(fd)
}
}
impl AsInstance for WasiInstance {
fn name(&self) -> &str {
self.inner.name()
}
fn func_count(&self) -> usize {
self.inner.func_len() as usize
}
fn func_names(&self) -> Option<Vec<String>> {
self.inner.func_names()
}
fn func(&self, name: impl AsRef<str>) -> WasmEdgeResult<Func> {
let inner_func = self.inner.get_func(name.as_ref())?;
Ok(Func {
inner: inner_func,
name: Some(name.as_ref().into()),
mod_name: None,
})
}
fn global_count(&self) -> usize {
self.inner.global_len() as usize
}
fn global_names(&self) -> Option<Vec<String>> {
self.inner.global_names()
}
fn global(&self, name: impl AsRef<str>) -> WasmEdgeResult<Global> {
let inner_global = self.inner.get_global(name.as_ref())?;
Ok(Global {
inner: inner_global,
name: Some(name.as_ref().into()),
mod_name: None,
})
}
fn memory_count(&self) -> usize {
self.inner.mem_len() as usize
}
fn memory_names(&self) -> Option<Vec<String>> {
self.inner.mem_names()
}
fn memory(&self, name: impl AsRef<str>) -> WasmEdgeResult<Memory> {
let inner_memory = self.inner.get_memory(name.as_ref())?;
Ok(Memory {
inner: inner_memory,
name: Some(name.as_ref().into()),
mod_name: None,
})
}
fn table_count(&self) -> usize {
self.inner.table_len() as usize
}
fn table_names(&self) -> Option<Vec<String>> {
self.inner.table_names()
}
fn table(&self, name: impl AsRef<str>) -> WasmEdgeResult<Table> {
let inner_table = self.inner.get_table(name.as_ref())?;
Ok(Table {
inner: inner_table,
name: Some(name.as_ref().into()),
mod_name: None,
})
}
}
#[cfg(all(target_os = "linux", feature = "wasi_nn", target_arch = "x86_64"))]
#[derive(Debug)]
pub struct WasiNnInstance {
pub(crate) inner: sys::WasiNnModule,
}
#[cfg(all(target_os = "linux", feature = "wasi_nn", target_arch = "x86_64"))]
impl AsInstance for WasiNnInstance {
fn name(&self) -> &str {
self.inner.name()
}
fn func_count(&self) -> usize {
self.inner.func_len() as usize
}
fn func_names(&self) -> Option<Vec<String>> {
self.inner.func_names()
}
fn func(&self, name: impl AsRef<str>) -> WasmEdgeResult<Func> {
let inner_func = self.inner.get_func(name.as_ref())?;
Ok(Func {
inner: inner_func,
name: Some(name.as_ref().into()),
mod_name: Some(self.inner.name().into()),
})
}
fn global_count(&self) -> usize {
self.inner.global_len() as usize
}
fn global_names(&self) -> Option<Vec<String>> {
self.inner.global_names()
}
fn global(&self, name: impl AsRef<str>) -> WasmEdgeResult<Global> {
let inner_global = self.inner.get_global(name.as_ref())?;
Ok(Global {
inner: inner_global,
name: Some(name.as_ref().into()),
mod_name: Some(self.inner.name().into()),
})
}
fn memory_count(&self) -> usize {
self.inner.mem_len() as usize
}
fn memory_names(&self) -> Option<Vec<String>> {
self.inner.mem_names()
}
fn memory(&self, name: impl AsRef<str>) -> WasmEdgeResult<Memory> {
let inner_memory = self.inner.get_memory(name.as_ref())?;
Ok(Memory {
inner: inner_memory,
name: Some(name.as_ref().into()),
mod_name: Some(self.inner.name().into()),
})
}
fn table_count(&self) -> usize {
self.inner.table_len() as usize
}
fn table_names(&self) -> Option<Vec<String>> {
self.inner.table_names()
}
fn table(&self, name: impl AsRef<str>) -> WasmEdgeResult<Table> {
let inner_table = self.inner.get_table(name.as_ref())?;
Ok(Table {
inner: inner_table,
name: Some(name.as_ref().into()),
mod_name: Some(self.inner.name().into()),
})
}
}
#[cfg(all(target_os = "linux", feature = "wasi_crypto"))]
#[derive(Debug)]
pub struct WasiCryptoCommonInstance {
pub(crate) inner: sys::WasiCryptoCommonModule,
}
#[cfg(all(target_os = "linux", feature = "wasi_crypto"))]
impl AsInstance for WasiCryptoCommonInstance {
fn name(&self) -> &str {
self.inner.name()
}
fn func_count(&self) -> usize {
self.inner.func_len() as usize
}
fn func_names(&self) -> Option<Vec<String>> {
self.inner.func_names()
}
fn func(&self, name: impl AsRef<str>) -> WasmEdgeResult<Func> {
let inner_func = self.inner.get_func(name.as_ref())?;
Ok(Func {
inner: inner_func,
name: Some(name.as_ref().into()),
mod_name: Some(self.inner.name().into()),
})
}
fn global_count(&self) -> usize {
self.inner.global_len() as usize
}
fn global_names(&self) -> Option<Vec<String>> {
self.inner.global_names()
}
fn global(&self, name: impl AsRef<str>) -> WasmEdgeResult<Global> {
let inner_global = self.inner.get_global(name.as_ref())?;
Ok(Global {
inner: inner_global,
name: Some(name.as_ref().into()),
mod_name: Some(self.inner.name().into()),
})
}
fn memory_count(&self) -> usize {
self.inner.mem_len() as usize
}
fn memory_names(&self) -> Option<Vec<String>> {
self.inner.mem_names()
}
fn memory(&self, name: impl AsRef<str>) -> WasmEdgeResult<Memory> {
let inner_memory = self.inner.get_memory(name.as_ref())?;
Ok(Memory {
inner: inner_memory,
name: Some(name.as_ref().into()),
mod_name: Some(self.inner.name().into()),
})
}
fn table_count(&self) -> usize {
self.inner.table_len() as usize
}
fn table_names(&self) -> Option<Vec<String>> {
self.inner.table_names()
}
fn table(&self, name: impl AsRef<str>) -> WasmEdgeResult<Table> {
let inner_table = self.inner.get_table(name.as_ref())?;
Ok(Table {
inner: inner_table,
name: Some(name.as_ref().into()),
mod_name: Some(self.inner.name().into()),
})
}
}
#[cfg(all(target_os = "linux", feature = "wasi_crypto"))]
#[derive(Debug)]
pub struct WasiCryptoAsymmetricCommonInstance {
pub(crate) inner: sys::WasiCryptoAsymmetricCommonModule,
}
#[cfg(all(target_os = "linux", feature = "wasi_crypto"))]
impl AsInstance for WasiCryptoAsymmetricCommonInstance {
fn name(&self) -> &str {
self.inner.name()
}
fn func_count(&self) -> usize {
self.inner.func_len() as usize
}
fn func_names(&self) -> Option<Vec<String>> {
self.inner.func_names()
}
fn func(&self, name: impl AsRef<str>) -> WasmEdgeResult<Func> {
let inner_func = self.inner.get_func(name.as_ref())?;
Ok(Func {
inner: inner_func,
name: Some(name.as_ref().into()),
mod_name: Some(self.inner.name().into()),
})
}
fn global_count(&self) -> usize {
self.inner.global_len() as usize
}
fn global_names(&self) -> Option<Vec<String>> {
self.inner.global_names()
}
fn global(&self, name: impl AsRef<str>) -> WasmEdgeResult<Global> {
let inner_global = self.inner.get_global(name.as_ref())?;
Ok(Global {
inner: inner_global,
name: Some(name.as_ref().into()),
mod_name: Some(self.inner.name().into()),
})
}
fn memory_count(&self) -> usize {
self.inner.mem_len() as usize
}
fn memory_names(&self) -> Option<Vec<String>> {
self.inner.mem_names()
}
fn memory(&self, name: impl AsRef<str>) -> WasmEdgeResult<Memory> {
let inner_memory = self.inner.get_memory(name.as_ref())?;
Ok(Memory {
inner: inner_memory,
name: Some(name.as_ref().into()),
mod_name: Some(self.inner.name().into()),
})
}
fn table_count(&self) -> usize {
self.inner.table_len() as usize
}
fn table_names(&self) -> Option<Vec<String>> {
self.inner.table_names()
}
fn table(&self, name: impl AsRef<str>) -> WasmEdgeResult<Table> {
let inner_table = self.inner.get_table(name.as_ref())?;
Ok(Table {
inner: inner_table,
name: Some(name.as_ref().into()),
mod_name: Some(self.inner.name().into()),
})
}
}
#[cfg(all(target_os = "linux", feature = "wasi_crypto"))]
#[derive(Debug)]
pub struct WasiCryptoSymmetricInstance {
pub(crate) inner: sys::WasiCryptoSymmetricModule,
}
#[cfg(all(target_os = "linux", feature = "wasi_crypto"))]
impl AsInstance for WasiCryptoSymmetricInstance {
fn name(&self) -> &str {
self.inner.name()
}
fn func_count(&self) -> usize {
self.inner.func_len() as usize
}
fn func_names(&self) -> Option<Vec<String>> {
self.inner.func_names()
}
fn func(&self, name: impl AsRef<str>) -> WasmEdgeResult<Func> {
let inner_func = self.inner.get_func(name.as_ref())?;
Ok(Func {
inner: inner_func,
name: Some(name.as_ref().into()),
mod_name: Some(self.inner.name().into()),
})
}
fn global_count(&self) -> usize {
self.inner.global_len() as usize
}
fn global_names(&self) -> Option<Vec<String>> {
self.inner.global_names()
}
fn global(&self, name: impl AsRef<str>) -> WasmEdgeResult<Global> {
let inner_global = self.inner.get_global(name.as_ref())?;
Ok(Global {
inner: inner_global,
name: Some(name.as_ref().into()),
mod_name: Some(self.inner.name().into()),
})
}
fn memory_count(&self) -> usize {
self.inner.mem_len() as usize
}
fn memory_names(&self) -> Option<Vec<String>> {
self.inner.mem_names()
}
fn memory(&self, name: impl AsRef<str>) -> WasmEdgeResult<Memory> {
let inner_memory = self.inner.get_memory(name.as_ref())?;
Ok(Memory {
inner: inner_memory,
name: Some(name.as_ref().into()),
mod_name: Some(self.inner.name().into()),
})
}
fn table_count(&self) -> usize {
self.inner.table_len() as usize
}
fn table_names(&self) -> Option<Vec<String>> {
self.inner.table_names()
}
fn table(&self, name: impl AsRef<str>) -> WasmEdgeResult<Table> {
let inner_table = self.inner.get_table(name.as_ref())?;
Ok(Table {
inner: inner_table,
name: Some(name.as_ref().into()),
mod_name: Some(self.inner.name().into()),
})
}
}
#[cfg(all(target_os = "linux", feature = "wasi_crypto"))]
#[derive(Debug)]
pub struct WasiCryptoKxInstance {
pub(crate) inner: sys::WasiCryptoKxModule,
}
#[cfg(all(target_os = "linux", feature = "wasi_crypto"))]
impl AsInstance for WasiCryptoKxInstance {
fn name(&self) -> &str {
self.inner.name()
}
fn func_count(&self) -> usize {
self.inner.func_len() as usize
}
fn func_names(&self) -> Option<Vec<String>> {
self.inner.func_names()
}
fn func(&self, name: impl AsRef<str>) -> WasmEdgeResult<Func> {
let inner_func = self.inner.get_func(name.as_ref())?;
Ok(Func {
inner: inner_func,
name: Some(name.as_ref().into()),
mod_name: Some(self.inner.name().into()),
})
}
fn global_count(&self) -> usize {
self.inner.global_len() as usize
}
fn global_names(&self) -> Option<Vec<String>> {
self.inner.global_names()
}
fn global(&self, name: impl AsRef<str>) -> WasmEdgeResult<Global> {
let inner_global = self.inner.get_global(name.as_ref())?;
Ok(Global {
inner: inner_global,
name: Some(name.as_ref().into()),
mod_name: Some(self.inner.name().into()),
})
}
fn memory_count(&self) -> usize {
self.inner.mem_len() as usize
}
fn memory_names(&self) -> Option<Vec<String>> {
self.inner.mem_names()
}
fn memory(&self, name: impl AsRef<str>) -> WasmEdgeResult<Memory> {
let inner_memory = self.inner.get_memory(name.as_ref())?;
Ok(Memory {
inner: inner_memory,
name: Some(name.as_ref().into()),
mod_name: Some(self.inner.name().into()),
})
}
fn table_count(&self) -> usize {
self.inner.table_len() as usize
}
fn table_names(&self) -> Option<Vec<String>> {
self.inner.table_names()
}
fn table(&self, name: impl AsRef<str>) -> WasmEdgeResult<Table> {
let inner_table = self.inner.get_table(name.as_ref())?;
Ok(Table {
inner: inner_table,
name: Some(name.as_ref().into()),
mod_name: Some(self.inner.name().into()),
})
}
}
#[cfg(all(target_os = "linux", feature = "wasi_crypto"))]
#[derive(Debug)]
pub struct WasiCryptoSignaturesInstance {
pub(crate) inner: sys::WasiCryptoSignaturesModule,
}
#[cfg(all(target_os = "linux", feature = "wasi_crypto"))]
impl AsInstance for WasiCryptoSignaturesInstance {
fn name(&self) -> &str {
self.inner.name()
}
fn func_count(&self) -> usize {
self.inner.func_len() as usize
}
fn func_names(&self) -> Option<Vec<String>> {
self.inner.func_names()
}
fn func(&self, name: impl AsRef<str>) -> WasmEdgeResult<Func> {
let inner_func = self.inner.get_func(name.as_ref())?;
Ok(Func {
inner: inner_func,
name: Some(name.as_ref().into()),
mod_name: Some(self.inner.name().into()),
})
}
fn global_count(&self) -> usize {
self.inner.global_len() as usize
}
fn global_names(&self) -> Option<Vec<String>> {
self.inner.global_names()
}
fn global(&self, name: impl AsRef<str>) -> WasmEdgeResult<Global> {
let inner_global = self.inner.get_global(name.as_ref())?;
Ok(Global {
inner: inner_global,
name: Some(name.as_ref().into()),
mod_name: Some(self.inner.name().into()),
})
}
fn memory_count(&self) -> usize {
self.inner.mem_len() as usize
}
fn memory_names(&self) -> Option<Vec<String>> {
self.inner.mem_names()
}
fn memory(&self, name: impl AsRef<str>) -> WasmEdgeResult<Memory> {
let inner_memory = self.inner.get_memory(name.as_ref())?;
Ok(Memory {
inner: inner_memory,
name: Some(name.as_ref().into()),
mod_name: Some(self.inner.name().into()),
})
}
fn table_count(&self) -> usize {
self.inner.table_len() as usize
}
fn table_names(&self) -> Option<Vec<String>> {
self.inner.table_names()
}
fn table(&self, name: impl AsRef<str>) -> WasmEdgeResult<Table> {
let inner_table = self.inner.get_table(name.as_ref())?;
Ok(Table {
inner: inner_table,
name: Some(name.as_ref().into()),
mod_name: Some(self.inner.name().into()),
})
}
}