Skip to main content

wasmedge_sys/
utils.rs

1//! Defines the versioning and logging functions.
2
3use crate::{
4    ffi::{self, WasmEdge_Result, WasmEdge_ResultGetCode, WasmEdge_ResultOK},
5    WasmEdgeResult,
6};
7use std::{
8    ffi::{CStr, CString},
9    path::Path,
10};
11use wasmedge_types::error::{
12    CoreCommonError, CoreComponentError, CoreError, CoreExecutionError, CoreInstantiationError,
13    CoreLoadError, CoreValidationError, WasmEdgeError,
14};
15
16#[cfg(unix)]
17pub(crate) fn path_to_cstring(path: &Path) -> WasmEdgeResult<CString> {
18    use std::os::unix::ffi::OsStrExt;
19    CString::new(path.as_os_str().as_bytes())
20        .map_err(|err| Box::new(WasmEdgeError::FoundNulByte(err)))
21}
22
23#[cfg(windows)]
24pub(crate) fn path_to_cstring(path: &Path) -> WasmEdgeResult<CString> {
25    match path.to_str() {
26        Some(s) => CString::new(s).map_err(|err| Box::new(WasmEdgeError::FoundNulByte(err))),
27        None => Err(Box::new(WasmEdgeError::WindowsPathConversion(
28            path.to_string_lossy().to_string(),
29        ))),
30    }
31}
32
33/// Logs the debug information.
34pub fn log_debug_info() {
35    unsafe { ffi::WasmEdge_LogSetDebugLevel() }
36}
37
38/// Logs the error information.
39pub fn log_error_info() {
40    unsafe { ffi::WasmEdge_LogSetErrorLevel() }
41}
42
43/// Sets the logging system off.
44pub fn log_off() {
45    unsafe { ffi::WasmEdge_LogOff() }
46}
47
48// Checks the result of a `FFI` function.
49pub(crate) fn check(result: WasmEdge_Result) -> WasmEdgeResult<()> {
50    let category = unsafe { ffi::WasmEdge_ResultGetCategory(result) };
51    let code = unsafe {
52        if !WasmEdge_ResultOK(result) {
53            WasmEdge_ResultGetCode(result)
54        } else {
55            0u32
56        }
57    } as ffi::WasmEdge_ErrCode;
58
59    match category {
60        ffi::WasmEdge_ErrCategory_UserLevelError => Err(Box::new(WasmEdgeError::User(code as _))),
61        ffi::WasmEdge_ErrCategory_WASM => gen_runtime_error(code),
62        _ => panic!("Invalid category value: {category}"),
63    }
64}
65
66fn gen_runtime_error(code: ffi::WasmEdge_ErrCode) -> WasmEdgeResult<()> {
67    match code {
68        // Success or terminated (exit and return success)
69        ffi::WasmEdge_ErrCode_Success => Ok(()),
70        ffi::WasmEdge_ErrCode_Terminated => Err(Box::new(WasmEdgeError::Core(CoreError::Common(
71            CoreCommonError::Terminated,
72        )))),
73        // Common errors
74        ffi::WasmEdge_ErrCode_RuntimeError => Err(Box::new(WasmEdgeError::Core(
75            CoreError::Common(CoreCommonError::RuntimeError),
76        ))),
77        ffi::WasmEdge_ErrCode_CostLimitExceeded => Err(Box::new(WasmEdgeError::Core(
78            CoreError::Common(CoreCommonError::CostLimitExceeded),
79        ))),
80        ffi::WasmEdge_ErrCode_WrongVMWorkflow => Err(Box::new(WasmEdgeError::Core(
81            CoreError::Common(CoreCommonError::WrongVMWorkflow),
82        ))),
83        ffi::WasmEdge_ErrCode_FuncNotFound => Err(Box::new(WasmEdgeError::Core(
84            CoreError::Common(CoreCommonError::FuncNotFound),
85        ))),
86        ffi::WasmEdge_ErrCode_AOTDisabled => Err(Box::new(WasmEdgeError::Core(CoreError::Common(
87            CoreCommonError::AOTDisabled,
88        )))),
89        ffi::WasmEdge_ErrCode_Interrupted => Err(Box::new(WasmEdgeError::Core(CoreError::Common(
90            CoreCommonError::Interrupted,
91        )))),
92        ffi::WasmEdge_ErrCode_NotValidated => Err(Box::new(WasmEdgeError::Core(
93            CoreError::Common(CoreCommonError::NotValidated),
94        ))),
95        ffi::WasmEdge_ErrCode_NonNullRequired => Err(Box::new(WasmEdgeError::Core(
96            CoreError::Common(CoreCommonError::NonNullRequired),
97        ))),
98        ffi::WasmEdge_ErrCode_SetValueToConst => Err(Box::new(WasmEdgeError::Core(
99            CoreError::Common(CoreCommonError::SetValueToConst),
100        ))),
101        ffi::WasmEdge_ErrCode_SetValueErrorType => Err(Box::new(WasmEdgeError::Core(
102            CoreError::Common(CoreCommonError::SetValueErrorType),
103        ))),
104        ffi::WasmEdge_ErrCode_UserDefError => Err(Box::new(WasmEdgeError::Core(
105            CoreError::Common(CoreCommonError::UserDefError),
106        ))),
107
108        // Load phase
109        ffi::WasmEdge_ErrCode_IllegalPath => Err(Box::new(WasmEdgeError::Core(CoreError::Load(
110            CoreLoadError::IllegalPath,
111        )))),
112        ffi::WasmEdge_ErrCode_ReadError => Err(Box::new(WasmEdgeError::Core(CoreError::Load(
113            CoreLoadError::ReadError,
114        )))),
115        ffi::WasmEdge_ErrCode_UnexpectedEnd => Err(Box::new(WasmEdgeError::Core(CoreError::Load(
116            CoreLoadError::UnexpectedEnd,
117        )))),
118        ffi::WasmEdge_ErrCode_MalformedMagic => Err(Box::new(WasmEdgeError::Core(
119            CoreError::Load(CoreLoadError::MalformedMagic),
120        ))),
121        ffi::WasmEdge_ErrCode_MalformedVersion => Err(Box::new(WasmEdgeError::Core(
122            CoreError::Load(CoreLoadError::MalformedVersion),
123        ))),
124        ffi::WasmEdge_ErrCode_MalformedSection => Err(Box::new(WasmEdgeError::Core(
125            CoreError::Load(CoreLoadError::MalformedSection),
126        ))),
127        ffi::WasmEdge_ErrCode_SectionSizeMismatch => Err(Box::new(WasmEdgeError::Core(
128            CoreError::Load(CoreLoadError::SectionSizeMismatch),
129        ))),
130        ffi::WasmEdge_ErrCode_LengthOutOfBounds => Err(Box::new(WasmEdgeError::Core(
131            CoreError::Load(CoreLoadError::LengthOutOfBounds),
132        ))),
133        ffi::WasmEdge_ErrCode_JunkSection => Err(Box::new(WasmEdgeError::Core(CoreError::Load(
134            CoreLoadError::JunkSection,
135        )))),
136        ffi::WasmEdge_ErrCode_IncompatibleFuncCode => Err(Box::new(WasmEdgeError::Core(
137            CoreError::Load(CoreLoadError::IncompatibleFuncCode),
138        ))),
139        ffi::WasmEdge_ErrCode_IncompatibleDataCount => Err(Box::new(WasmEdgeError::Core(
140            CoreError::Load(CoreLoadError::IncompatibleDataCount),
141        ))),
142        ffi::WasmEdge_ErrCode_DataCountRequired => Err(Box::new(WasmEdgeError::Core(
143            CoreError::Load(CoreLoadError::DataCountRequired),
144        ))),
145        ffi::WasmEdge_ErrCode_MalformedImportKind => Err(Box::new(WasmEdgeError::Core(
146            CoreError::Load(CoreLoadError::MalformedImportKind),
147        ))),
148        ffi::WasmEdge_ErrCode_MalformedExportKind => Err(Box::new(WasmEdgeError::Core(
149            CoreError::Load(CoreLoadError::MalformedExportKind),
150        ))),
151        ffi::WasmEdge_ErrCode_ExpectedZeroByte => Err(Box::new(WasmEdgeError::Core(
152            CoreError::Load(CoreLoadError::ExpectedZeroByte),
153        ))),
154        ffi::WasmEdge_ErrCode_InvalidMut => Err(Box::new(WasmEdgeError::Core(CoreError::Load(
155            CoreLoadError::InvalidMut,
156        )))),
157        ffi::WasmEdge_ErrCode_TooManyLocals => Err(Box::new(WasmEdgeError::Core(CoreError::Load(
158            CoreLoadError::TooManyLocals,
159        )))),
160        ffi::WasmEdge_ErrCode_MalformedValType => Err(Box::new(WasmEdgeError::Core(
161            CoreError::Load(CoreLoadError::MalformedValType),
162        ))),
163        ffi::WasmEdge_ErrCode_MalformedElemType => Err(Box::new(WasmEdgeError::Core(
164            CoreError::Load(CoreLoadError::MalformedElemType),
165        ))),
166        ffi::WasmEdge_ErrCode_MalformedRefType => Err(Box::new(WasmEdgeError::Core(
167            CoreError::Load(CoreLoadError::MalformedRefType),
168        ))),
169        ffi::WasmEdge_ErrCode_MalformedUTF8 => Err(Box::new(WasmEdgeError::Core(CoreError::Load(
170            CoreLoadError::MalformedUTF8,
171        )))),
172        ffi::WasmEdge_ErrCode_IntegerTooLarge => Err(Box::new(WasmEdgeError::Core(
173            CoreError::Load(CoreLoadError::IntegerTooLarge),
174        ))),
175        ffi::WasmEdge_ErrCode_IntegerTooLong => Err(Box::new(WasmEdgeError::Core(
176            CoreError::Load(CoreLoadError::IntegerTooLong),
177        ))),
178        ffi::WasmEdge_ErrCode_IllegalOpCode => Err(Box::new(WasmEdgeError::Core(CoreError::Load(
179            CoreLoadError::IllegalOpCode,
180        )))),
181        ffi::WasmEdge_ErrCode_IllegalGrammar => Err(Box::new(WasmEdgeError::Core(
182            CoreError::Load(CoreLoadError::IllegalGrammar),
183        ))),
184        ffi::WasmEdge_ErrCode_SharedMemoryNoMax => Err(Box::new(WasmEdgeError::Core(
185            CoreError::Load(CoreLoadError::SharedMemoryNoMax),
186        ))),
187        ffi::WasmEdge_ErrCode_IntrinsicsTableNotFound => Err(Box::new(WasmEdgeError::Core(
188            CoreError::Load(CoreLoadError::IntrinsicsTableNotFound),
189        ))),
190        ffi::WasmEdge_ErrCode_MalformedTable => Err(Box::new(WasmEdgeError::Core(
191            CoreError::Load(CoreLoadError::MalformedTable),
192        ))),
193
194        // Validation phase
195        ffi::WasmEdge_ErrCode_InvalidAlignment => Err(Box::new(WasmEdgeError::Core(
196            CoreError::Validation(CoreValidationError::InvalidAlignment),
197        ))),
198        ffi::WasmEdge_ErrCode_TypeCheckFailed => Err(Box::new(WasmEdgeError::Core(
199            CoreError::Validation(CoreValidationError::TypeCheckFailed),
200        ))),
201        ffi::WasmEdge_ErrCode_InvalidLabelIdx => Err(Box::new(WasmEdgeError::Core(
202            CoreError::Validation(CoreValidationError::InvalidLabelIdx),
203        ))),
204        ffi::WasmEdge_ErrCode_InvalidLocalIdx => Err(Box::new(WasmEdgeError::Core(
205            CoreError::Validation(CoreValidationError::InvalidLocalIdx),
206        ))),
207        ffi::WasmEdge_ErrCode_InvalidFieldIdx => Err(Box::new(WasmEdgeError::Core(
208            CoreError::Validation(CoreValidationError::InvalidFieldIdx),
209        ))),
210        ffi::WasmEdge_ErrCode_InvalidFuncTypeIdx => Err(Box::new(WasmEdgeError::Core(
211            CoreError::Validation(CoreValidationError::InvalidFuncTypeIdx),
212        ))),
213        ffi::WasmEdge_ErrCode_InvalidFuncIdx => Err(Box::new(WasmEdgeError::Core(
214            CoreError::Validation(CoreValidationError::InvalidFuncIdx),
215        ))),
216        ffi::WasmEdge_ErrCode_InvalidTableIdx => Err(Box::new(WasmEdgeError::Core(
217            CoreError::Validation(CoreValidationError::InvalidTableIdx),
218        ))),
219        ffi::WasmEdge_ErrCode_InvalidMemoryIdx => Err(Box::new(WasmEdgeError::Core(
220            CoreError::Validation(CoreValidationError::InvalidMemoryIdx),
221        ))),
222        ffi::WasmEdge_ErrCode_InvalidGlobalIdx => Err(Box::new(WasmEdgeError::Core(
223            CoreError::Validation(CoreValidationError::InvalidGlobalIdx),
224        ))),
225        ffi::WasmEdge_ErrCode_InvalidElemIdx => Err(Box::new(WasmEdgeError::Core(
226            CoreError::Validation(CoreValidationError::InvalidElemIdx),
227        ))),
228        ffi::WasmEdge_ErrCode_InvalidDataIdx => Err(Box::new(WasmEdgeError::Core(
229            CoreError::Validation(CoreValidationError::InvalidDataIdx),
230        ))),
231        ffi::WasmEdge_ErrCode_InvalidRefIdx => Err(Box::new(WasmEdgeError::Core(
232            CoreError::Validation(CoreValidationError::InvalidRefIdx),
233        ))),
234        ffi::WasmEdge_ErrCode_ConstExprRequired => Err(Box::new(WasmEdgeError::Core(
235            CoreError::Validation(CoreValidationError::ConstExprRequired),
236        ))),
237        ffi::WasmEdge_ErrCode_DupExportName => Err(Box::new(WasmEdgeError::Core(
238            CoreError::Validation(CoreValidationError::DupExportName),
239        ))),
240        ffi::WasmEdge_ErrCode_ImmutableGlobal => Err(Box::new(WasmEdgeError::Core(
241            CoreError::Validation(CoreValidationError::ImmutableGlobal),
242        ))),
243        ffi::WasmEdge_ErrCode_ImmutableField => Err(Box::new(WasmEdgeError::Core(
244            CoreError::Validation(CoreValidationError::ImmutableField),
245        ))),
246        ffi::WasmEdge_ErrCode_ImmutableArray => Err(Box::new(WasmEdgeError::Core(
247            CoreError::Validation(CoreValidationError::ImmutableArray),
248        ))),
249        ffi::WasmEdge_ErrCode_InvalidResultArity => Err(Box::new(WasmEdgeError::Core(
250            CoreError::Validation(CoreValidationError::InvalidResultArity),
251        ))),
252        ffi::WasmEdge_ErrCode_MultiTables => Err(Box::new(WasmEdgeError::Core(
253            CoreError::Validation(CoreValidationError::MultiTables),
254        ))),
255        ffi::WasmEdge_ErrCode_MultiMemories => Err(Box::new(WasmEdgeError::Core(
256            CoreError::Validation(CoreValidationError::MultiMemories),
257        ))),
258        ffi::WasmEdge_ErrCode_InvalidLimit => Err(Box::new(WasmEdgeError::Core(
259            CoreError::Validation(CoreValidationError::InvalidLimit),
260        ))),
261        ffi::WasmEdge_ErrCode_InvalidMemPages => Err(Box::new(WasmEdgeError::Core(
262            CoreError::Validation(CoreValidationError::InvalidMemPages),
263        ))),
264        ffi::WasmEdge_ErrCode_InvalidStartFunc => Err(Box::new(WasmEdgeError::Core(
265            CoreError::Validation(CoreValidationError::InvalidStartFunc),
266        ))),
267        ffi::WasmEdge_ErrCode_InvalidLaneIdx => Err(Box::new(WasmEdgeError::Core(
268            CoreError::Validation(CoreValidationError::InvalidLaneIdx),
269        ))),
270        ffi::WasmEdge_ErrCode_InvalidUninitLocal => Err(Box::new(WasmEdgeError::Core(
271            CoreError::Validation(CoreValidationError::InvalidUninitLocal),
272        ))),
273        ffi::WasmEdge_ErrCode_InvalidNotDefaultableField => Err(Box::new(WasmEdgeError::Core(
274            CoreError::Validation(CoreValidationError::InvalidNotDefaultableField),
275        ))),
276        ffi::WasmEdge_ErrCode_InvalidNotDefaultableArray => Err(Box::new(WasmEdgeError::Core(
277            CoreError::Validation(CoreValidationError::InvalidNotDefaultableArray),
278        ))),
279        ffi::WasmEdge_ErrCode_InvalidPackedField => Err(Box::new(WasmEdgeError::Core(
280            CoreError::Validation(CoreValidationError::InvalidPackedField),
281        ))),
282        ffi::WasmEdge_ErrCode_InvalidPackedArray => Err(Box::new(WasmEdgeError::Core(
283            CoreError::Validation(CoreValidationError::InvalidPackedArray),
284        ))),
285        ffi::WasmEdge_ErrCode_InvalidUnpackedField => Err(Box::new(WasmEdgeError::Core(
286            CoreError::Validation(CoreValidationError::InvalidUnpackedField),
287        ))),
288        ffi::WasmEdge_ErrCode_InvalidUnpackedArray => Err(Box::new(WasmEdgeError::Core(
289            CoreError::Validation(CoreValidationError::InvalidUnpackedArray),
290        ))),
291        ffi::WasmEdge_ErrCode_InvalidBrRefType => Err(Box::new(WasmEdgeError::Core(
292            CoreError::Validation(CoreValidationError::InvalidBrRefType),
293        ))),
294        ffi::WasmEdge_ErrCode_ArrayTypesMismatch => Err(Box::new(WasmEdgeError::Core(
295            CoreError::Validation(CoreValidationError::ArrayTypesMismatch),
296        ))),
297        ffi::WasmEdge_ErrCode_ArrayTypesNumtypeRequired => Err(Box::new(WasmEdgeError::Core(
298            CoreError::Validation(CoreValidationError::ArrayTypesNumtypeRequired),
299        ))),
300        ffi::WasmEdge_ErrCode_InvalidSubType => Err(Box::new(WasmEdgeError::Core(
301            CoreError::Validation(CoreValidationError::InvalidSubType),
302        ))),
303
304        // Instantiation phase
305        ffi::WasmEdge_ErrCode_ModuleNameConflict => Err(Box::new(WasmEdgeError::Core(
306            CoreError::Instantiation(CoreInstantiationError::ModuleNameConflict),
307        ))),
308        ffi::WasmEdge_ErrCode_IncompatibleImportType => Err(Box::new(WasmEdgeError::Core(
309            CoreError::Instantiation(CoreInstantiationError::IncompatibleImportType),
310        ))),
311        ffi::WasmEdge_ErrCode_UnknownImport => Err(Box::new(WasmEdgeError::Core(
312            CoreError::Instantiation(CoreInstantiationError::UnknownImport),
313        ))),
314        ffi::WasmEdge_ErrCode_DataSegDoesNotFit => Err(Box::new(WasmEdgeError::Core(
315            CoreError::Instantiation(CoreInstantiationError::DataSegDoesNotFit),
316        ))),
317        ffi::WasmEdge_ErrCode_ElemSegDoesNotFit => Err(Box::new(WasmEdgeError::Core(
318            CoreError::Instantiation(CoreInstantiationError::ElemSegDoesNotFit),
319        ))),
320
321        // Execution phase
322        ffi::WasmEdge_ErrCode_WrongInstanceAddress => Err(Box::new(WasmEdgeError::Core(
323            CoreError::Execution(CoreExecutionError::WrongInstanceAddress),
324        ))),
325        ffi::WasmEdge_ErrCode_WrongInstanceIndex => Err(Box::new(WasmEdgeError::Core(
326            CoreError::Execution(CoreExecutionError::WrongInstanceIndex),
327        ))),
328        ffi::WasmEdge_ErrCode_InstrTypeMismatch => Err(Box::new(WasmEdgeError::Core(
329            CoreError::Execution(CoreExecutionError::InstrTypeMismatch),
330        ))),
331        ffi::WasmEdge_ErrCode_FuncSigMismatch => Err(Box::new(WasmEdgeError::Core(
332            CoreError::Execution(CoreExecutionError::FuncSigMismatch),
333        ))),
334        ffi::WasmEdge_ErrCode_DivideByZero => Err(Box::new(WasmEdgeError::Core(
335            CoreError::Execution(CoreExecutionError::DivideByZero),
336        ))),
337        ffi::WasmEdge_ErrCode_IntegerOverflow => Err(Box::new(WasmEdgeError::Core(
338            CoreError::Execution(CoreExecutionError::IntegerOverflow),
339        ))),
340        ffi::WasmEdge_ErrCode_InvalidConvToInt => Err(Box::new(WasmEdgeError::Core(
341            CoreError::Execution(CoreExecutionError::InvalidConvToInt),
342        ))),
343        ffi::WasmEdge_ErrCode_TableOutOfBounds => Err(Box::new(WasmEdgeError::Core(
344            CoreError::Execution(CoreExecutionError::TableOutOfBounds),
345        ))),
346        ffi::WasmEdge_ErrCode_MemoryOutOfBounds => Err(Box::new(WasmEdgeError::Core(
347            CoreError::Execution(CoreExecutionError::MemoryOutOfBounds),
348        ))),
349        ffi::WasmEdge_ErrCode_ArrayOutOfBounds => Err(Box::new(WasmEdgeError::Core(
350            CoreError::Execution(CoreExecutionError::ArrayOutOfBounds),
351        ))),
352        ffi::WasmEdge_ErrCode_Unreachable => Err(Box::new(WasmEdgeError::Core(
353            CoreError::Execution(CoreExecutionError::Unreachable),
354        ))),
355        ffi::WasmEdge_ErrCode_UninitializedElement => Err(Box::new(WasmEdgeError::Core(
356            CoreError::Execution(CoreExecutionError::UninitializedElement),
357        ))),
358        ffi::WasmEdge_ErrCode_UndefinedElement => Err(Box::new(WasmEdgeError::Core(
359            CoreError::Execution(CoreExecutionError::UndefinedElement),
360        ))),
361        ffi::WasmEdge_ErrCode_IndirectCallTypeMismatch => Err(Box::new(WasmEdgeError::Core(
362            CoreError::Execution(CoreExecutionError::IndirectCallTypeMismatch),
363        ))),
364        ffi::WasmEdge_ErrCode_HostFuncError => Err(Box::new(WasmEdgeError::Core(
365            CoreError::Execution(CoreExecutionError::HostFuncFailed),
366        ))),
367        ffi::WasmEdge_ErrCode_RefTypeMismatch => Err(Box::new(WasmEdgeError::Core(
368            CoreError::Execution(CoreExecutionError::RefTypeMismatch),
369        ))),
370        ffi::WasmEdge_ErrCode_UnalignedAtomicAccess => Err(Box::new(WasmEdgeError::Core(
371            CoreError::Execution(CoreExecutionError::UnalignedAtomicAccess),
372        ))),
373        ffi::WasmEdge_ErrCode_ExpectSharedMemory => Err(Box::new(WasmEdgeError::Core(
374            CoreError::Execution(CoreExecutionError::ExpectSharedMemory),
375        ))),
376        ffi::WasmEdge_ErrCode_CastNullToNonNull => Err(Box::new(WasmEdgeError::Core(
377            CoreError::Execution(CoreExecutionError::CastNullToNonNull),
378        ))),
379        ffi::WasmEdge_ErrCode_AccessNullFunc => Err(Box::new(WasmEdgeError::Core(
380            CoreError::Execution(CoreExecutionError::AccessNullFunc),
381        ))),
382        ffi::WasmEdge_ErrCode_AccessNullStruct => Err(Box::new(WasmEdgeError::Core(
383            CoreError::Execution(CoreExecutionError::AccessNullStruct),
384        ))),
385        ffi::WasmEdge_ErrCode_AccessNullArray => Err(Box::new(WasmEdgeError::Core(
386            CoreError::Execution(CoreExecutionError::AccessNullArray),
387        ))),
388        ffi::WasmEdge_ErrCode_AccessNullI31 => Err(Box::new(WasmEdgeError::Core(
389            CoreError::Execution(CoreExecutionError::AccessNullI31),
390        ))),
391        ffi::WasmEdge_ErrCode_CastFailed => Err(Box::new(WasmEdgeError::Core(
392            CoreError::Execution(CoreExecutionError::CastFailed),
393        ))),
394
395        // Component model phase
396        ffi::WasmEdge_ErrCode_MalformedSort => Err(Box::new(WasmEdgeError::Core(
397            CoreError::Component(CoreComponentError::MalformedSort),
398        ))),
399        ffi::WasmEdge_ErrCode_MalformedAliasTarget => Err(Box::new(WasmEdgeError::Core(
400            CoreError::Component(CoreComponentError::MalformedAliasTarget),
401        ))),
402        ffi::WasmEdge_ErrCode_MalformedCoreInstance => Err(Box::new(WasmEdgeError::Core(
403            CoreError::Component(CoreComponentError::MalformedCoreInstance),
404        ))),
405        ffi::WasmEdge_ErrCode_MalformedInstance => Err(Box::new(WasmEdgeError::Core(
406            CoreError::Component(CoreComponentError::MalformedInstance),
407        ))),
408        ffi::WasmEdge_ErrCode_MalformedDefType => Err(Box::new(WasmEdgeError::Core(
409            CoreError::Component(CoreComponentError::MalformedDefType),
410        ))),
411        ffi::WasmEdge_ErrCode_MalformedRecordType => Err(Box::new(WasmEdgeError::Core(
412            CoreError::Component(CoreComponentError::MalformedRecordType),
413        ))),
414        ffi::WasmEdge_ErrCode_MalformedVariantType => Err(Box::new(WasmEdgeError::Core(
415            CoreError::Component(CoreComponentError::MalformedVariantType),
416        ))),
417        ffi::WasmEdge_ErrCode_MalformedTupleType => Err(Box::new(WasmEdgeError::Core(
418            CoreError::Component(CoreComponentError::MalformedTupleType),
419        ))),
420        ffi::WasmEdge_ErrCode_MalformedFlagsType => Err(Box::new(WasmEdgeError::Core(
421            CoreError::Component(CoreComponentError::MalformedFlagsType),
422        ))),
423        ffi::WasmEdge_ErrCode_MalformedCanonical => Err(Box::new(WasmEdgeError::Core(
424            CoreError::Component(CoreComponentError::MalformedCanonical),
425        ))),
426        ffi::WasmEdge_ErrCode_UnknownCanonicalOption => Err(Box::new(WasmEdgeError::Core(
427            CoreError::Component(CoreComponentError::UnknownCanonicalOption),
428        ))),
429        ffi::WasmEdge_ErrCode_MalformedName => Err(Box::new(WasmEdgeError::Core(
430            CoreError::Component(CoreComponentError::MalformedName),
431        ))),
432        c => Err(Box::new(WasmEdgeError::Core(CoreError::UnknownError(
433            c as _,
434        )))),
435    }
436}
437
438impl From<CoreError> for WasmEdge_Result {
439    fn from(val: CoreError) -> WasmEdge_Result {
440        let code = match val {
441            // Common errors
442            CoreError::Common(e) => match e {
443                CoreCommonError::Terminated => ffi::WasmEdge_ErrCode_Terminated,
444                CoreCommonError::RuntimeError => ffi::WasmEdge_ErrCode_RuntimeError,
445                CoreCommonError::CostLimitExceeded => ffi::WasmEdge_ErrCode_CostLimitExceeded,
446                CoreCommonError::WrongVMWorkflow => ffi::WasmEdge_ErrCode_WrongVMWorkflow,
447                CoreCommonError::FuncNotFound => ffi::WasmEdge_ErrCode_FuncNotFound,
448                CoreCommonError::AOTDisabled => ffi::WasmEdge_ErrCode_AOTDisabled,
449                CoreCommonError::Interrupted => ffi::WasmEdge_ErrCode_Interrupted,
450                CoreCommonError::UserDefError => ffi::WasmEdge_ErrCode_UserDefError,
451                CoreCommonError::NotValidated => ffi::WasmEdge_ErrCode_NotValidated,
452                CoreCommonError::NonNullRequired => ffi::WasmEdge_ErrCode_NonNullRequired,
453                CoreCommonError::SetValueToConst => ffi::WasmEdge_ErrCode_SetValueToConst,
454                CoreCommonError::SetValueErrorType => ffi::WasmEdge_ErrCode_SetValueErrorType,
455            },
456
457            // Load phase
458            CoreError::Load(e) => match e {
459                CoreLoadError::IllegalPath => ffi::WasmEdge_ErrCode_IllegalPath,
460                CoreLoadError::ReadError => ffi::WasmEdge_ErrCode_ReadError,
461                CoreLoadError::UnexpectedEnd => ffi::WasmEdge_ErrCode_UnexpectedEnd,
462                CoreLoadError::MalformedMagic => ffi::WasmEdge_ErrCode_MalformedMagic,
463                CoreLoadError::MalformedVersion => ffi::WasmEdge_ErrCode_MalformedVersion,
464                CoreLoadError::MalformedSection => ffi::WasmEdge_ErrCode_MalformedSection,
465                CoreLoadError::SectionSizeMismatch => ffi::WasmEdge_ErrCode_SectionSizeMismatch,
466                CoreLoadError::LengthOutOfBounds => ffi::WasmEdge_ErrCode_LengthOutOfBounds,
467                CoreLoadError::JunkSection => ffi::WasmEdge_ErrCode_JunkSection,
468                CoreLoadError::IncompatibleFuncCode => ffi::WasmEdge_ErrCode_IncompatibleFuncCode,
469                CoreLoadError::IncompatibleDataCount => ffi::WasmEdge_ErrCode_IncompatibleDataCount,
470                CoreLoadError::DataCountRequired => ffi::WasmEdge_ErrCode_DataCountRequired,
471                CoreLoadError::MalformedImportKind => ffi::WasmEdge_ErrCode_MalformedImportKind,
472                CoreLoadError::MalformedExportKind => ffi::WasmEdge_ErrCode_MalformedExportKind,
473                CoreLoadError::ExpectedZeroByte => ffi::WasmEdge_ErrCode_ExpectedZeroByte,
474                CoreLoadError::InvalidMut => ffi::WasmEdge_ErrCode_InvalidMut,
475                CoreLoadError::TooManyLocals => ffi::WasmEdge_ErrCode_TooManyLocals,
476                CoreLoadError::MalformedValType => ffi::WasmEdge_ErrCode_MalformedValType,
477                CoreLoadError::MalformedElemType => ffi::WasmEdge_ErrCode_MalformedElemType,
478                CoreLoadError::MalformedRefType => ffi::WasmEdge_ErrCode_MalformedRefType,
479                CoreLoadError::MalformedUTF8 => ffi::WasmEdge_ErrCode_MalformedUTF8,
480                CoreLoadError::IntegerTooLarge => ffi::WasmEdge_ErrCode_IntegerTooLarge,
481                CoreLoadError::IntegerTooLong => ffi::WasmEdge_ErrCode_IntegerTooLong,
482                CoreLoadError::IllegalOpCode => ffi::WasmEdge_ErrCode_IllegalOpCode,
483                CoreLoadError::IllegalGrammar => ffi::WasmEdge_ErrCode_IllegalGrammar,
484                CoreLoadError::SharedMemoryNoMax => ffi::WasmEdge_ErrCode_SharedMemoryNoMax,
485                CoreLoadError::IntrinsicsTableNotFound => {
486                    ffi::WasmEdge_ErrCode_IntrinsicsTableNotFound
487                }
488                CoreLoadError::MalformedTable => ffi::WasmEdge_ErrCode_MalformedTable,
489            },
490
491            // Validation phase
492            CoreError::Validation(e) => match e {
493                CoreValidationError::InvalidAlignment => ffi::WasmEdge_ErrCode_InvalidAlignment,
494                CoreValidationError::TypeCheckFailed => ffi::WasmEdge_ErrCode_TypeCheckFailed,
495                CoreValidationError::InvalidLabelIdx => ffi::WasmEdge_ErrCode_InvalidLabelIdx,
496                CoreValidationError::InvalidLocalIdx => ffi::WasmEdge_ErrCode_InvalidLocalIdx,
497                CoreValidationError::InvalidFieldIdx => ffi::WasmEdge_ErrCode_InvalidFieldIdx,
498                CoreValidationError::InvalidFuncTypeIdx => ffi::WasmEdge_ErrCode_InvalidFuncTypeIdx,
499                CoreValidationError::InvalidFuncIdx => ffi::WasmEdge_ErrCode_InvalidFuncIdx,
500                CoreValidationError::InvalidTableIdx => ffi::WasmEdge_ErrCode_InvalidTableIdx,
501                CoreValidationError::InvalidMemoryIdx => ffi::WasmEdge_ErrCode_InvalidMemoryIdx,
502                CoreValidationError::InvalidGlobalIdx => ffi::WasmEdge_ErrCode_InvalidGlobalIdx,
503                CoreValidationError::InvalidElemIdx => ffi::WasmEdge_ErrCode_InvalidElemIdx,
504                CoreValidationError::InvalidDataIdx => ffi::WasmEdge_ErrCode_InvalidDataIdx,
505                CoreValidationError::InvalidRefIdx => ffi::WasmEdge_ErrCode_InvalidRefIdx,
506                CoreValidationError::ConstExprRequired => ffi::WasmEdge_ErrCode_ConstExprRequired,
507                CoreValidationError::DupExportName => ffi::WasmEdge_ErrCode_DupExportName,
508                CoreValidationError::ImmutableGlobal => ffi::WasmEdge_ErrCode_ImmutableGlobal,
509                CoreValidationError::ImmutableField => ffi::WasmEdge_ErrCode_ImmutableField,
510                CoreValidationError::ImmutableArray => ffi::WasmEdge_ErrCode_ImmutableArray,
511                CoreValidationError::InvalidResultArity => ffi::WasmEdge_ErrCode_InvalidResultArity,
512                CoreValidationError::MultiTables => ffi::WasmEdge_ErrCode_MultiTables,
513                CoreValidationError::MultiMemories => ffi::WasmEdge_ErrCode_MultiMemories,
514                CoreValidationError::InvalidLimit => ffi::WasmEdge_ErrCode_InvalidLimit,
515                CoreValidationError::InvalidMemPages => ffi::WasmEdge_ErrCode_InvalidMemPages,
516                CoreValidationError::InvalidStartFunc => ffi::WasmEdge_ErrCode_InvalidStartFunc,
517                CoreValidationError::InvalidLaneIdx => ffi::WasmEdge_ErrCode_InvalidLaneIdx,
518                CoreValidationError::InvalidUninitLocal => ffi::WasmEdge_ErrCode_InvalidUninitLocal,
519                CoreValidationError::InvalidNotDefaultableField => {
520                    ffi::WasmEdge_ErrCode_InvalidNotDefaultableField
521                }
522                CoreValidationError::InvalidNotDefaultableArray => {
523                    ffi::WasmEdge_ErrCode_InvalidNotDefaultableArray
524                }
525                CoreValidationError::InvalidPackedField => ffi::WasmEdge_ErrCode_InvalidPackedField,
526                CoreValidationError::InvalidPackedArray => ffi::WasmEdge_ErrCode_InvalidPackedArray,
527                CoreValidationError::InvalidUnpackedField => {
528                    ffi::WasmEdge_ErrCode_InvalidUnpackedField
529                }
530                CoreValidationError::InvalidUnpackedArray => {
531                    ffi::WasmEdge_ErrCode_InvalidUnpackedArray
532                }
533                CoreValidationError::InvalidBrRefType => ffi::WasmEdge_ErrCode_InvalidBrRefType,
534                CoreValidationError::ArrayTypesMismatch => ffi::WasmEdge_ErrCode_ArrayTypesMismatch,
535                CoreValidationError::ArrayTypesNumtypeRequired => {
536                    ffi::WasmEdge_ErrCode_ArrayTypesNumtypeRequired
537                }
538                CoreValidationError::InvalidSubType => ffi::WasmEdge_ErrCode_InvalidSubType,
539            },
540
541            // Instantiation phase
542            CoreError::Instantiation(e) => match e {
543                CoreInstantiationError::ModuleNameConflict => {
544                    ffi::WasmEdge_ErrCode_ModuleNameConflict
545                }
546                CoreInstantiationError::IncompatibleImportType => {
547                    ffi::WasmEdge_ErrCode_IncompatibleImportType
548                }
549                CoreInstantiationError::UnknownImport => ffi::WasmEdge_ErrCode_UnknownImport,
550                CoreInstantiationError::DataSegDoesNotFit => {
551                    ffi::WasmEdge_ErrCode_DataSegDoesNotFit
552                }
553                CoreInstantiationError::ElemSegDoesNotFit => {
554                    ffi::WasmEdge_ErrCode_ElemSegDoesNotFit
555                }
556            },
557
558            // Execution phase
559            CoreError::Execution(e) => match e {
560                CoreExecutionError::WrongInstanceAddress => {
561                    ffi::WasmEdge_ErrCode_WrongInstanceAddress
562                }
563                CoreExecutionError::WrongInstanceIndex => ffi::WasmEdge_ErrCode_WrongInstanceIndex,
564                CoreExecutionError::InstrTypeMismatch => ffi::WasmEdge_ErrCode_InstrTypeMismatch,
565                CoreExecutionError::FuncSigMismatch => ffi::WasmEdge_ErrCode_FuncSigMismatch,
566                CoreExecutionError::DivideByZero => ffi::WasmEdge_ErrCode_DivideByZero,
567                CoreExecutionError::IntegerOverflow => ffi::WasmEdge_ErrCode_IntegerOverflow,
568                CoreExecutionError::InvalidConvToInt => ffi::WasmEdge_ErrCode_InvalidConvToInt,
569                CoreExecutionError::TableOutOfBounds => ffi::WasmEdge_ErrCode_TableOutOfBounds,
570                CoreExecutionError::MemoryOutOfBounds => ffi::WasmEdge_ErrCode_MemoryOutOfBounds,
571                CoreExecutionError::ArrayOutOfBounds => ffi::WasmEdge_ErrCode_ArrayOutOfBounds,
572                CoreExecutionError::Unreachable => ffi::WasmEdge_ErrCode_Unreachable,
573                CoreExecutionError::UninitializedElement => {
574                    ffi::WasmEdge_ErrCode_UninitializedElement
575                }
576                CoreExecutionError::UndefinedElement => ffi::WasmEdge_ErrCode_UndefinedElement,
577                CoreExecutionError::IndirectCallTypeMismatch => {
578                    ffi::WasmEdge_ErrCode_IndirectCallTypeMismatch
579                }
580                CoreExecutionError::HostFuncFailed => ffi::WasmEdge_ErrCode_HostFuncError,
581                CoreExecutionError::RefTypeMismatch => ffi::WasmEdge_ErrCode_RefTypeMismatch,
582                CoreExecutionError::UnalignedAtomicAccess => {
583                    ffi::WasmEdge_ErrCode_UnalignedAtomicAccess
584                }
585                CoreExecutionError::ExpectSharedMemory => ffi::WasmEdge_ErrCode_ExpectSharedMemory,
586                CoreExecutionError::CastNullToNonNull => ffi::WasmEdge_ErrCode_CastNullToNonNull,
587                CoreExecutionError::AccessNullFunc => ffi::WasmEdge_ErrCode_AccessNullFunc,
588                CoreExecutionError::AccessNullStruct => ffi::WasmEdge_ErrCode_AccessNullStruct,
589                CoreExecutionError::AccessNullArray => ffi::WasmEdge_ErrCode_AccessNullArray,
590                CoreExecutionError::AccessNullI31 => ffi::WasmEdge_ErrCode_AccessNullI31,
591                CoreExecutionError::CastFailed => ffi::WasmEdge_ErrCode_CastFailed,
592            },
593
594            CoreError::Component(e) => match e {
595                CoreComponentError::MalformedSort => ffi::WasmEdge_ErrCode_MalformedSort,
596                CoreComponentError::MalformedAliasTarget => {
597                    ffi::WasmEdge_ErrCode_MalformedAliasTarget
598                }
599                CoreComponentError::MalformedCoreInstance => {
600                    ffi::WasmEdge_ErrCode_MalformedCoreInstance
601                }
602                CoreComponentError::MalformedInstance => ffi::WasmEdge_ErrCode_MalformedInstance,
603                CoreComponentError::MalformedDefType => ffi::WasmEdge_ErrCode_MalformedDefType,
604                CoreComponentError::MalformedRecordType => {
605                    ffi::WasmEdge_ErrCode_MalformedRecordType
606                }
607                CoreComponentError::MalformedVariantType => {
608                    ffi::WasmEdge_ErrCode_MalformedVariantType
609                }
610                CoreComponentError::MalformedTupleType => ffi::WasmEdge_ErrCode_MalformedTupleType,
611                CoreComponentError::MalformedFlagsType => ffi::WasmEdge_ErrCode_MalformedFlagsType,
612                CoreComponentError::MalformedCanonical => ffi::WasmEdge_ErrCode_MalformedCanonical,
613                CoreComponentError::UnknownCanonicalOption => {
614                    ffi::WasmEdge_ErrCode_UnknownCanonicalOption
615                }
616                CoreComponentError::MalformedName => ffi::WasmEdge_ErrCode_MalformedName,
617            },
618            CoreError::UnknownError(c) => c as ffi::WasmEdge_ErrCode,
619        };
620        unsafe { ffi::WasmEdge_ResultGen(ffi::WasmEdge_ErrCategory_WASM, code as _) }
621    }
622}
623
624/// Returns the major version value.
625pub fn version_major_value() -> u32 {
626    unsafe { ffi::WasmEdge_VersionGetMajor() }
627}
628
629/// Returns the minor version value.
630pub fn version_minor_value() -> u32 {
631    unsafe { ffi::WasmEdge_VersionGetMinor() }
632}
633
634/// Returns the patch version value.
635pub fn version_patch_value() -> u32 {
636    unsafe { ffi::WasmEdge_VersionGetPatch() }
637}
638
639/// Returns the version string.
640pub fn version_string() -> String {
641    unsafe {
642        CStr::from_ptr(ffi::WasmEdge_VersionGet())
643            .to_string_lossy()
644            .into_owned()
645    }
646}
647
648/// Triggers the WasmEdge AOT compiler tool
649pub fn driver_aot_compiler<I, V>(args: I) -> i32
650where
651    I: IntoIterator<Item = V>,
652    V: AsRef<str>,
653{
654    // create a vector of zero terminated strings
655    let args = args
656        .into_iter()
657        .map(|arg| CString::new(arg.as_ref()).unwrap())
658        .collect::<Vec<CString>>();
659
660    // convert the strings to raw pointers
661    let mut c_args = args
662        .iter()
663        .map(|arg| arg.as_ptr())
664        .collect::<Vec<*const std::os::raw::c_char>>();
665
666    unsafe {
667        ffi::WasmEdge_Driver_Compiler(c_args.len() as std::os::raw::c_int, c_args.as_mut_ptr())
668    }
669}
670
671/// Triggers the WasmEdge runtime tool
672pub fn driver_runtime_tool<I, V>(args: I) -> i32
673where
674    I: IntoIterator<Item = V>,
675    V: AsRef<str>,
676{
677    // create a vector of zero terminated strings
678    let args = args
679        .into_iter()
680        .map(|arg| CString::new(arg.as_ref()).unwrap())
681        .collect::<Vec<CString>>();
682
683    // convert the strings to raw pointers
684    let mut c_args = args
685        .iter()
686        .map(|arg| arg.as_ptr())
687        .collect::<Vec<*const std::os::raw::c_char>>();
688
689    unsafe { ffi::WasmEdge_Driver_Tool(c_args.len() as std::os::raw::c_int, c_args.as_mut_ptr()) }
690}
691
692/// Triggers the WasmEdge unified tool
693pub fn driver_unified_tool<I, V>(args: I) -> i32
694where
695    I: IntoIterator<Item = V>,
696    V: AsRef<str>,
697{
698    // create a vector of zero terminated strings
699    let args = args
700        .into_iter()
701        .map(|arg| CString::new(arg.as_ref()).unwrap())
702        .collect::<Vec<CString>>();
703
704    // convert the strings to raw pointers
705    let mut c_args = args
706        .iter()
707        .map(|arg| arg.as_ptr())
708        .collect::<Vec<*const std::os::raw::c_char>>();
709
710    unsafe {
711        ffi::WasmEdge_Driver_UniTool(c_args.len() as std::os::raw::c_int, c_args.as_mut_ptr())
712    }
713}