pub mod error;
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
pub enum RefType {
FuncRef,
ExternRef,
}
impl From<u32> for RefType {
fn from(value: u32) -> Self {
match value {
112 => RefType::FuncRef,
111 => RefType::ExternRef,
_ => panic!("[wasmedge-types] Invalid WasmEdge_RefType: {value:#X}"),
}
}
}
impl From<RefType> for u32 {
fn from(value: RefType) -> Self {
match value {
RefType::FuncRef => 112,
RefType::ExternRef => 111,
}
}
}
impl From<i32> for RefType {
fn from(value: i32) -> Self {
match value {
112 => RefType::FuncRef,
111 => RefType::ExternRef,
_ => panic!("[wasmedge-types] Invalid WasmEdge_RefType: {value:#X}"),
}
}
}
impl From<RefType> for i32 {
fn from(value: RefType) -> Self {
match value {
RefType::FuncRef => 112,
RefType::ExternRef => 111,
}
}
}
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
pub enum ValType {
I32,
I64,
F32,
F64,
V128,
FuncRef,
ExternRef,
}
impl From<u32> for ValType {
fn from(value: u32) -> Self {
match value {
127 => ValType::I32,
126 => ValType::I64,
125 => ValType::F32,
124 => ValType::F64,
123 => ValType::V128,
112 => ValType::FuncRef,
111 => ValType::ExternRef,
_ => panic!("[wasmedge-types] Invalid WasmEdge_ValType: {value:#X}"),
}
}
}
impl From<ValType> for u32 {
fn from(value: ValType) -> Self {
match value {
ValType::I32 => 127,
ValType::I64 => 126,
ValType::F32 => 125,
ValType::F64 => 124,
ValType::V128 => 123,
ValType::FuncRef => 112,
ValType::ExternRef => 111,
}
}
}
impl From<i32> for ValType {
fn from(value: i32) -> Self {
match value {
127 => ValType::I32,
126 => ValType::I64,
125 => ValType::F32,
124 => ValType::F64,
123 => ValType::V128,
112 => ValType::FuncRef,
111 => ValType::ExternRef,
_ => panic!("[wasmedge-types] Invalid WasmEdge_ValType: {value:#X}"),
}
}
}
impl From<ValType> for i32 {
fn from(value: ValType) -> Self {
match value {
ValType::I32 => 127,
ValType::I64 => 126,
ValType::F32 => 125,
ValType::F64 => 124,
ValType::V128 => 123,
ValType::FuncRef => 112,
ValType::ExternRef => 111,
}
}
}
#[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,
}
impl From<u32> for HostRegistration {
fn from(val: u32) -> Self {
match val {
0 => HostRegistration::Wasi,
1 => HostRegistration::WasmEdgeProcess,
_ => panic!("Unknown WasmEdge_HostRegistration value: {val}"),
}
}
}
impl From<HostRegistration> for u32 {
fn from(val: HostRegistration) -> u32 {
match val {
HostRegistration::Wasi => 0,
HostRegistration::WasmEdgeProcess => 1,
}
}
}
#[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: {:#X}",
value
),
}
}
}
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: {:#X}",
value
),
}
}
}
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: Option<Vec<ValType>>,
returns: Option<Vec<ValType>>,
}
impl FuncType {
pub fn new(args: Option<Vec<ValType>>, returns: Option<Vec<ValType>>) -> Self {
Self { args, returns }
}
pub fn args(&self) -> Option<&[ValType]> {
match &self.args {
Some(args) => Some(args.as_ref()),
None => None,
}
}
pub fn args_len(&self) -> u32 {
match &self.args {
Some(args) => args.len() as u32,
None => 0,
}
}
pub fn returns(&self) -> Option<&[ValType]> {
match &self.returns {
Some(returns) => Some(returns.as_ref()),
None => None,
}
}
pub fn returns_len(&self) -> u32 {
match &self.returns {
Some(returns) => returns.len() as u32,
None => 0,
}
}
}
#[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>>;