1#![doc(
2 html_logo_url = "https://github.com/cncf/artwork/blob/master/projects/wasm-edge-runtime/icon/color/wasm-edge-runtime-icon-color.png?raw=true",
3 html_favicon_url = "https://raw.githubusercontent.com/cncf/artwork/49169bdbc88a7ce3c4a722c641cc2d548bd5c340/projects/wasm-edge-runtime/icon/color/wasm-edge-runtime-icon-color.svg"
4)]
5
6pub mod error;
13
14#[derive(Debug, Copy, Clone, Eq, PartialEq)]
16pub enum RefType {
17 FuncRef,
19
20 ExternRef,
22}
23
24impl From<ValType> for RefType {
25 fn from(value: ValType) -> Self {
26 match value {
27 ValType::FuncRef => RefType::FuncRef,
28 ValType::ExternRef => RefType::ExternRef,
29 _ => panic!("[wasmedge-types] Invalid WasmEdge_RefType: {value:#X?}"),
30 }
31 }
32}
33
34impl From<RefType> for ValType {
35 fn from(value: RefType) -> Self {
36 match value {
37 RefType::FuncRef => ValType::FuncRef,
38 RefType::ExternRef => ValType::ExternRef,
39 }
40 }
41}
42
43#[derive(Debug, Copy, Clone, Eq, PartialEq)]
45pub enum ValType {
46 I32,
50 I64,
54 F32,
56 F64,
58 V128,
63 FuncRef,
65 ExternRef,
67 UnsupportedRef,
69}
70
71#[derive(Debug, Copy, Clone, Eq, PartialEq)]
75pub enum Mutability {
76 Const,
78 Var,
80}
81impl From<u32> for Mutability {
82 fn from(value: u32) -> Self {
83 match value {
84 0 => Mutability::Const,
85 1 => Mutability::Var,
86 _ => panic!("[wasmedge-types] Invalid WasmEdge_Mutability: {value:#X}"),
87 }
88 }
89}
90impl From<Mutability> for u32 {
91 fn from(value: Mutability) -> Self {
92 match value {
93 Mutability::Const => 0,
94 Mutability::Var => 1,
95 }
96 }
97}
98impl From<i32> for Mutability {
99 fn from(value: i32) -> Self {
100 match value {
101 0 => Mutability::Const,
102 1 => Mutability::Var,
103 _ => panic!("[wasmedge-types] Invalid WasmEdge_Mutability: {value:#X}"),
104 }
105 }
106}
107impl From<Mutability> for i32 {
108 fn from(value: Mutability) -> Self {
109 match value {
110 Mutability::Const => 0,
111 Mutability::Var => 1,
112 }
113 }
114}
115
116#[derive(Clone, Copy, Debug, PartialEq, Eq)]
118pub enum CompilerOptimizationLevel {
119 O0,
121
122 O1,
124
125 O2,
127
128 O3,
130
131 Os,
134
135 Oz,
137}
138impl From<u32> for CompilerOptimizationLevel {
139 fn from(val: u32) -> CompilerOptimizationLevel {
140 match val {
141 0 => CompilerOptimizationLevel::O0,
142 1 => CompilerOptimizationLevel::O1,
143 2 => CompilerOptimizationLevel::O2,
144 3 => CompilerOptimizationLevel::O3,
145 4 => CompilerOptimizationLevel::Os,
146 5 => CompilerOptimizationLevel::Oz,
147 _ => panic!("Unknown CompilerOptimizationLevel value: {val}"),
148 }
149 }
150}
151impl From<CompilerOptimizationLevel> for u32 {
152 fn from(val: CompilerOptimizationLevel) -> u32 {
153 match val {
154 CompilerOptimizationLevel::O0 => 0,
155 CompilerOptimizationLevel::O1 => 1,
156 CompilerOptimizationLevel::O2 => 2,
157 CompilerOptimizationLevel::O3 => 3,
158 CompilerOptimizationLevel::Os => 4,
159 CompilerOptimizationLevel::Oz => 5,
160 }
161 }
162}
163impl From<i32> for CompilerOptimizationLevel {
164 fn from(val: i32) -> CompilerOptimizationLevel {
165 match val {
166 0 => CompilerOptimizationLevel::O0,
167 1 => CompilerOptimizationLevel::O1,
168 2 => CompilerOptimizationLevel::O2,
169 3 => CompilerOptimizationLevel::O3,
170 4 => CompilerOptimizationLevel::Os,
171 5 => CompilerOptimizationLevel::Oz,
172 _ => panic!("Unknown CompilerOptimizationLevel value: {val}"),
173 }
174 }
175}
176impl From<CompilerOptimizationLevel> for i32 {
177 fn from(val: CompilerOptimizationLevel) -> i32 {
178 match val {
179 CompilerOptimizationLevel::O0 => 0,
180 CompilerOptimizationLevel::O1 => 1,
181 CompilerOptimizationLevel::O2 => 2,
182 CompilerOptimizationLevel::O3 => 3,
183 CompilerOptimizationLevel::Os => 4,
184 CompilerOptimizationLevel::Oz => 5,
185 }
186 }
187}
188
189#[derive(Clone, Copy, Debug, PartialEq, Eq)]
191pub enum CompilerOutputFormat {
192 Native,
194
195 Wasm,
197}
198impl From<u32> for CompilerOutputFormat {
199 fn from(val: u32) -> CompilerOutputFormat {
200 match val {
201 0 => CompilerOutputFormat::Native,
202 1 => CompilerOutputFormat::Wasm,
203 _ => panic!("Unknown CompilerOutputFormat value: {val}"),
204 }
205 }
206}
207impl From<CompilerOutputFormat> for u32 {
208 fn from(val: CompilerOutputFormat) -> u32 {
209 match val {
210 CompilerOutputFormat::Native => 0,
211 CompilerOutputFormat::Wasm => 1,
212 }
213 }
214}
215impl From<i32> for CompilerOutputFormat {
216 fn from(val: i32) -> CompilerOutputFormat {
217 match val {
218 0 => CompilerOutputFormat::Native,
219 1 => CompilerOutputFormat::Wasm,
220 _ => panic!("Unknown CompilerOutputFormat value: {val}"),
221 }
222 }
223}
224impl From<CompilerOutputFormat> for i32 {
225 fn from(val: CompilerOutputFormat) -> i32 {
226 match val {
227 CompilerOutputFormat::Native => 0,
228 CompilerOutputFormat::Wasm => 1,
229 }
230 }
231}
232
233#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
239pub enum RunMode {
240 #[default]
243 Interpreter,
244
245 Jit,
247
248 Aot,
252}
253impl From<u32> for RunMode {
254 fn from(val: u32) -> RunMode {
255 match val {
256 0 => RunMode::Interpreter,
257 1 => RunMode::Jit,
258 2 => RunMode::Aot,
259 _ => panic!("Unknown RunMode value: {val}"),
260 }
261 }
262}
263impl From<RunMode> for u32 {
264 fn from(val: RunMode) -> u32 {
265 match val {
266 RunMode::Interpreter => 0,
267 RunMode::Jit => 1,
268 RunMode::Aot => 2,
269 }
270 }
271}
272impl From<i32> for RunMode {
273 fn from(val: i32) -> RunMode {
274 match val {
275 0 => RunMode::Interpreter,
276 1 => RunMode::Jit,
277 2 => RunMode::Aot,
278 _ => panic!("Unknown RunMode value: {val}"),
279 }
280 }
281}
282impl From<RunMode> for i32 {
283 fn from(val: RunMode) -> i32 {
284 match val {
285 RunMode::Interpreter => 0,
286 RunMode::Jit => 1,
287 RunMode::Aot => 2,
288 }
289 }
290}
291
292#[derive(Clone, Copy, Debug, PartialEq, Eq)]
298pub enum WasmStandard {
299 Wasm1,
301
302 Wasm2,
306
307 Wasm3,
311}
312impl From<u32> for WasmStandard {
313 fn from(val: u32) -> WasmStandard {
314 match val {
315 0 => WasmStandard::Wasm1,
316 1 => WasmStandard::Wasm2,
317 2 => WasmStandard::Wasm3,
318 _ => panic!("Unknown WasmStandard value: {val}"),
319 }
320 }
321}
322impl From<WasmStandard> for u32 {
323 fn from(val: WasmStandard) -> u32 {
324 match val {
325 WasmStandard::Wasm1 => 0,
326 WasmStandard::Wasm2 => 1,
327 WasmStandard::Wasm3 => 2,
328 }
329 }
330}
331impl From<i32> for WasmStandard {
332 fn from(val: i32) -> WasmStandard {
333 match val {
334 0 => WasmStandard::Wasm1,
335 1 => WasmStandard::Wasm2,
336 2 => WasmStandard::Wasm3,
337 _ => panic!("Unknown WasmStandard value: {val}"),
338 }
339 }
340}
341impl From<WasmStandard> for i32 {
342 fn from(val: WasmStandard) -> i32 {
343 match val {
344 WasmStandard::Wasm1 => 0,
345 WasmStandard::Wasm2 => 1,
346 WasmStandard::Wasm3 => 2,
347 }
348 }
349}
350
351#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
353pub enum HostRegistration {
354 Wasi,
355 WasmEdgeProcess,
356 WasiNn,
357 WasiCryptoCommon,
358 WasiCryptoAsymmetricCommon,
359 WasiCryptoKx,
360 WasiCryptoSignatures,
361 WasiCryptoSymmetric,
362}
363impl From<u32> for HostRegistration {
364 fn from(val: u32) -> Self {
365 match val {
366 0 => HostRegistration::Wasi,
367 1 => HostRegistration::WasmEdgeProcess,
368 2 => HostRegistration::WasiNn,
369 3 => HostRegistration::WasiCryptoCommon,
370 4 => HostRegistration::WasiCryptoAsymmetricCommon,
371 5 => HostRegistration::WasiCryptoKx,
372 6 => HostRegistration::WasiCryptoSignatures,
373 7 => HostRegistration::WasiCryptoSymmetric,
374 _ => panic!("Unknown WasmEdge_HostRegistration value: {val}"),
375 }
376 }
377}
378impl From<HostRegistration> for u32 {
379 fn from(val: HostRegistration) -> u32 {
380 match val {
381 HostRegistration::Wasi => 0,
382 HostRegistration::WasmEdgeProcess => 1,
383 HostRegistration::WasiNn => 2,
384 HostRegistration::WasiCryptoCommon => 3,
385 HostRegistration::WasiCryptoAsymmetricCommon => 4,
386 HostRegistration::WasiCryptoKx => 5,
387 HostRegistration::WasiCryptoSignatures => 6,
388 HostRegistration::WasiCryptoSymmetric => 7,
389 }
390 }
391}
392
393#[derive(Debug, Clone, PartialEq, Eq)]
395pub enum ExternalInstanceType {
396 Func(FuncType),
398 Table(TableType),
400 Memory(MemoryType),
402 Global(GlobalType),
404}
405impl From<u32> for ExternalInstanceType {
406 fn from(value: u32) -> Self {
407 match value {
408 0 => ExternalInstanceType::Func(FuncType::default()),
409 1 => ExternalInstanceType::Table(TableType::default()),
410 2 => ExternalInstanceType::Memory(MemoryType::default()),
411 3 => ExternalInstanceType::Global(GlobalType::default()),
412 _ => panic!("[wasmedge-types] Invalid WasmEdge_ExternalType: {value:#X}",),
413 }
414 }
415}
416impl From<i32> for ExternalInstanceType {
417 fn from(value: i32) -> Self {
418 match value {
419 0 => ExternalInstanceType::Func(FuncType::default()),
420 1 => ExternalInstanceType::Table(TableType::default()),
421 2 => ExternalInstanceType::Memory(MemoryType::default()),
422 3 => ExternalInstanceType::Global(GlobalType::default()),
423 _ => panic!("[wasmedge-types] Invalid WasmEdge_ExternalType: {value:#X}",),
424 }
425 }
426}
427impl std::fmt::Display for ExternalInstanceType {
428 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
429 let message = match self {
430 ExternalInstanceType::Func(_) => "function",
431 ExternalInstanceType::Table(_) => "table",
432 ExternalInstanceType::Memory(_) => "memory",
433 ExternalInstanceType::Global(_) => "global",
434 };
435 write!(f, "{message}")
436 }
437}
438
439#[derive(Debug, Clone, PartialEq, Eq, Default)]
443pub struct FuncType {
444 args: Vec<ValType>,
445 returns: Vec<ValType>,
446}
447impl FuncType {
448 pub fn new(args: Vec<ValType>, returns: Vec<ValType>) -> Self {
456 Self { args, returns }
457 }
458
459 pub fn args(&self) -> &[ValType] {
461 &self.args
462 }
463
464 pub fn args_len(&self) -> usize {
466 self.args.len()
467 }
468
469 pub fn returns(&self) -> &[ValType] {
471 &self.returns
472 }
473
474 pub fn returns_len(&self) -> usize {
476 self.returns.len()
477 }
478}
479
480#[derive(Debug, Clone, PartialEq, Eq)]
484pub struct TableType {
485 elem_ty: RefType,
486 min: u32,
487 max: Option<u32>,
488}
489impl TableType {
490 pub fn new(elem_ty: RefType, min: u32, max: Option<u32>) -> Self {
500 Self { elem_ty, min, max }
501 }
502
503 pub fn elem_ty(&self) -> RefType {
505 self.elem_ty
506 }
507
508 pub fn minimum(&self) -> u32 {
510 self.min
511 }
512
513 pub fn maximum(&self) -> Option<u32> {
515 self.max
516 }
517}
518impl Default for TableType {
519 fn default() -> Self {
520 Self {
521 elem_ty: RefType::FuncRef,
522 min: 0,
523 max: None,
524 }
525 }
526}
527
528#[derive(Debug, Clone, PartialEq, Eq, Default)]
532pub struct MemoryType {
533 min: u32,
534 max: Option<u32>,
535 shared: bool,
536}
537impl MemoryType {
538 pub fn new(min: u32, max: Option<u32>, shared: bool) -> WasmEdgeResult<Self> {
548 if shared && max.is_none() {
549 return Err(Box::new(error::WasmEdgeError::Mem(
550 error::MemError::CreateSharedType,
551 )));
552 }
553 Ok(Self { min, max, shared })
554 }
555
556 pub fn minimum(&self) -> u32 {
558 self.min
559 }
560
561 pub fn maximum(&self) -> Option<u32> {
563 self.max
564 }
565
566 pub fn shared(&self) -> bool {
568 self.shared
569 }
570}
571
572#[derive(Debug, Clone, PartialEq, Eq)]
576pub struct GlobalType {
577 ty: ValType,
578 mutability: Mutability,
579}
580impl GlobalType {
581 pub fn new(ty: ValType, mutability: Mutability) -> Self {
589 Self { ty, mutability }
590 }
591
592 pub fn value_ty(&self) -> ValType {
594 self.ty
595 }
596
597 pub fn mutability(&self) -> Mutability {
599 self.mutability
600 }
601}
602impl Default for GlobalType {
603 fn default() -> Self {
604 Self {
605 ty: ValType::I32,
606 mutability: Mutability::Var,
607 }
608 }
609}
610
611pub use wat::parse_bytes as wat2wasm;
613
614pub type WasmEdgeResult<T> = Result<T, Box<error::WasmEdgeError>>;
616
617#[derive(Debug, Clone)]
619pub enum NeverType {}
620unsafe impl Send for NeverType {}
621unsafe impl Sync for NeverType {}