#![doc(
html_logo_url = "https://github.com/cncf/artwork/blob/master/projects/wasm-edge-runtime/icon/color/wasm-edge-runtime-icon-color.png?raw=true",
html_favicon_url = "https://raw.githubusercontent.com/cncf/artwork/49169bdbc88a7ce3c4a722c641cc2d548bd5c340/projects/wasm-edge-runtime/icon/color/wasm-edge-runtime-icon-color.svg"
)]
pub mod error;
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
pub enum RefType {
FuncRef,
ExternRef,
}
impl From<ValType> for RefType {
fn from(value: ValType) -> Self {
match value {
ValType::FuncRef => RefType::FuncRef,
ValType::ExternRef => RefType::ExternRef,
_ => panic!("[wasmedge-types] Invalid WasmEdge_RefType: {value:#X?}"),
}
}
}
impl From<RefType> for ValType {
fn from(value: RefType) -> Self {
match value {
RefType::FuncRef => ValType::FuncRef,
RefType::ExternRef => ValType::ExternRef,
}
}
}
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
pub enum ValType {
I32,
I64,
F32,
F64,
V128,
FuncRef,
ExternRef,
UnsupportedRef,
}
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
pub enum Mutability {
Const,
Var,
}
impl From<u32> for Mutability {
fn from(value: u32) -> Self {
match value {
0 => Mutability::Const,
1 => Mutability::Var,
_ => panic!("[wasmedge-types] Invalid WasmEdge_Mutability: {value:#X}"),
}
}
}
impl From<Mutability> for u32 {
fn from(value: Mutability) -> Self {
match value {
Mutability::Const => 0,
Mutability::Var => 1,
}
}
}
impl From<i32> for Mutability {
fn from(value: i32) -> Self {
match value {
0 => Mutability::Const,
1 => Mutability::Var,
_ => panic!("[wasmedge-types] Invalid WasmEdge_Mutability: {value:#X}"),
}
}
}
impl From<Mutability> for i32 {
fn from(value: Mutability) -> Self {
match value {
Mutability::Const => 0,
Mutability::Var => 1,
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum CompilerOptimizationLevel {
O0,
O1,
O2,
O3,
Os,
Oz,
}
impl From<u32> for CompilerOptimizationLevel {
fn from(val: u32) -> CompilerOptimizationLevel {
match val {
0 => CompilerOptimizationLevel::O0,
1 => CompilerOptimizationLevel::O1,
2 => CompilerOptimizationLevel::O2,
3 => CompilerOptimizationLevel::O3,
4 => CompilerOptimizationLevel::Os,
5 => CompilerOptimizationLevel::Oz,
_ => panic!("Unknown CompilerOptimizationLevel value: {val}"),
}
}
}
impl From<CompilerOptimizationLevel> for u32 {
fn from(val: CompilerOptimizationLevel) -> u32 {
match val {
CompilerOptimizationLevel::O0 => 0,
CompilerOptimizationLevel::O1 => 1,
CompilerOptimizationLevel::O2 => 2,
CompilerOptimizationLevel::O3 => 3,
CompilerOptimizationLevel::Os => 4,
CompilerOptimizationLevel::Oz => 5,
}
}
}
impl From<i32> for CompilerOptimizationLevel {
fn from(val: i32) -> CompilerOptimizationLevel {
match val {
0 => CompilerOptimizationLevel::O0,
1 => CompilerOptimizationLevel::O1,
2 => CompilerOptimizationLevel::O2,
3 => CompilerOptimizationLevel::O3,
4 => CompilerOptimizationLevel::Os,
5 => CompilerOptimizationLevel::Oz,
_ => panic!("Unknown CompilerOptimizationLevel value: {val}"),
}
}
}
impl From<CompilerOptimizationLevel> for i32 {
fn from(val: CompilerOptimizationLevel) -> i32 {
match val {
CompilerOptimizationLevel::O0 => 0,
CompilerOptimizationLevel::O1 => 1,
CompilerOptimizationLevel::O2 => 2,
CompilerOptimizationLevel::O3 => 3,
CompilerOptimizationLevel::Os => 4,
CompilerOptimizationLevel::Oz => 5,
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum CompilerOutputFormat {
Native,
Wasm,
}
impl From<u32> for CompilerOutputFormat {
fn from(val: u32) -> CompilerOutputFormat {
match val {
0 => CompilerOutputFormat::Native,
1 => CompilerOutputFormat::Wasm,
_ => panic!("Unknown CompilerOutputFormat value: {val}"),
}
}
}
impl From<CompilerOutputFormat> for u32 {
fn from(val: CompilerOutputFormat) -> u32 {
match val {
CompilerOutputFormat::Native => 0,
CompilerOutputFormat::Wasm => 1,
}
}
}
impl From<i32> for CompilerOutputFormat {
fn from(val: i32) -> CompilerOutputFormat {
match val {
0 => CompilerOutputFormat::Native,
1 => CompilerOutputFormat::Wasm,
_ => panic!("Unknown CompilerOutputFormat value: {val}"),
}
}
}
impl From<CompilerOutputFormat> for i32 {
fn from(val: CompilerOutputFormat) -> i32 {
match val {
CompilerOutputFormat::Native => 0,
CompilerOutputFormat::Wasm => 1,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum HostRegistration {
Wasi,
WasmEdgeProcess,
WasiNn,
WasiCryptoCommon,
WasiCryptoAsymmetricCommon,
WasiCryptoKx,
WasiCryptoSignatures,
WasiCryptoSymmetric,
}
impl From<u32> for HostRegistration {
fn from(val: u32) -> Self {
match val {
0 => HostRegistration::Wasi,
1 => HostRegistration::WasmEdgeProcess,
2 => HostRegistration::WasiNn,
3 => HostRegistration::WasiCryptoCommon,
4 => HostRegistration::WasiCryptoAsymmetricCommon,
5 => HostRegistration::WasiCryptoKx,
6 => HostRegistration::WasiCryptoSignatures,
7 => HostRegistration::WasiCryptoSymmetric,
_ => panic!("Unknown WasmEdge_HostRegistration value: {val}"),
}
}
}
impl From<HostRegistration> for u32 {
fn from(val: HostRegistration) -> u32 {
match val {
HostRegistration::Wasi => 0,
HostRegistration::WasmEdgeProcess => 1,
HostRegistration::WasiNn => 2,
HostRegistration::WasiCryptoCommon => 3,
HostRegistration::WasiCryptoAsymmetricCommon => 4,
HostRegistration::WasiCryptoKx => 5,
HostRegistration::WasiCryptoSignatures => 6,
HostRegistration::WasiCryptoSymmetric => 7,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ExternalInstanceType {
Func(FuncType),
Table(TableType),
Memory(MemoryType),
Global(GlobalType),
}
impl From<u32> for ExternalInstanceType {
fn from(value: u32) -> Self {
match value {
0 => ExternalInstanceType::Func(FuncType::default()),
1 => ExternalInstanceType::Table(TableType::default()),
2 => ExternalInstanceType::Memory(MemoryType::default()),
3 => ExternalInstanceType::Global(GlobalType::default()),
_ => panic!("[wasmedge-types] Invalid WasmEdge_ExternalType: {value:#X}",),
}
}
}
impl From<i32> for ExternalInstanceType {
fn from(value: i32) -> Self {
match value {
0 => ExternalInstanceType::Func(FuncType::default()),
1 => ExternalInstanceType::Table(TableType::default()),
2 => ExternalInstanceType::Memory(MemoryType::default()),
3 => ExternalInstanceType::Global(GlobalType::default()),
_ => panic!("[wasmedge-types] Invalid WasmEdge_ExternalType: {value:#X}",),
}
}
}
impl std::fmt::Display for ExternalInstanceType {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let message = match self {
ExternalInstanceType::Func(_) => "function",
ExternalInstanceType::Table(_) => "table",
ExternalInstanceType::Memory(_) => "memory",
ExternalInstanceType::Global(_) => "global",
};
write!(f, "{message}")
}
}
#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub struct FuncType {
args: Vec<ValType>,
returns: Vec<ValType>,
}
impl FuncType {
pub fn new(args: Vec<ValType>, returns: Vec<ValType>) -> Self {
Self { args, returns }
}
pub fn args(&self) -> &[ValType] {
&self.args
}
pub fn args_len(&self) -> usize {
self.args.len()
}
pub fn returns(&self) -> &[ValType] {
&self.returns
}
pub fn returns_len(&self) -> usize {
self.returns.len()
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct TableType {
elem_ty: RefType,
min: u32,
max: Option<u32>,
}
impl TableType {
pub fn new(elem_ty: RefType, min: u32, max: Option<u32>) -> Self {
Self { elem_ty, min, max }
}
pub fn elem_ty(&self) -> RefType {
self.elem_ty
}
pub fn minimum(&self) -> u32 {
self.min
}
pub fn maximum(&self) -> Option<u32> {
self.max
}
}
impl Default for TableType {
fn default() -> Self {
Self {
elem_ty: RefType::FuncRef,
min: 0,
max: None,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub struct MemoryType {
min: u32,
max: Option<u32>,
shared: bool,
}
impl MemoryType {
pub fn new(min: u32, max: Option<u32>, shared: bool) -> WasmEdgeResult<Self> {
if shared && max.is_none() {
return Err(Box::new(error::WasmEdgeError::Mem(
error::MemError::CreateSharedType,
)));
}
Ok(Self { min, max, shared })
}
pub fn minimum(&self) -> u32 {
self.min
}
pub fn maximum(&self) -> Option<u32> {
self.max
}
pub fn shared(&self) -> bool {
self.shared
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct GlobalType {
ty: ValType,
mutability: Mutability,
}
impl GlobalType {
pub fn new(ty: ValType, mutability: Mutability) -> Self {
Self { ty, mutability }
}
pub fn value_ty(&self) -> ValType {
self.ty
}
pub fn mutability(&self) -> Mutability {
self.mutability
}
}
impl Default for GlobalType {
fn default() -> Self {
Self {
ty: ValType::I32,
mutability: Mutability::Var,
}
}
}
pub use wat::parse_bytes as wat2wasm;
pub type WasmEdgeResult<T> = Result<T, Box<error::WasmEdgeError>>;
#[derive(Debug, Clone)]
pub enum NeverType {}
unsafe impl Send for NeverType {}
unsafe impl Sync for NeverType {}