Skip to content
This repository was archived by the owner on Aug 14, 2023. It is now read-only.

Commit c8aaa6f

Browse files
adding rustdoc examples to svm-runtime-c-api (#72)
1 parent acd2c22 commit c8aaa6f

4 files changed

Lines changed: 254 additions & 16 deletions

File tree

crates/svm-runtime-c-api/src/api.rs

Lines changed: 227 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,24 @@ macro_rules! to_svm_byte_array {
4949
}};
5050
}
5151

52-
/// Allocates host imports
52+
/// Allocates space for the host imports.
53+
///
54+
/// # Example
55+
///
56+
/// ```rust
57+
/// use svm_runtime_c_api::svm_imports_alloc;
58+
///
59+
/// let count = 2;
60+
/// let mut imports = std::ptr::null_mut();
61+
///
62+
/// let res = unsafe { svm_imports_alloc(&mut imports, count) };
63+
/// assert!(res.is_ok());
64+
/// ```
65+
///
5366
#[must_use]
5467
#[no_mangle]
55-
pub unsafe extern "C" fn svm_imports_alloc(imports: *mut *mut c_void, length: u32) -> svm_result_t {
56-
let vec: Vec<svm_import_t> = Vec::with_capacity(length as usize);
68+
pub unsafe extern "C" fn svm_imports_alloc(imports: *mut *mut c_void, count: u32) -> svm_result_t {
69+
let vec: Vec<svm_import_t> = Vec::with_capacity(count as usize);
5770

5871
*imports = svm_common::into_raw_mut(vec);
5972

@@ -62,6 +75,31 @@ pub unsafe extern "C" fn svm_imports_alloc(imports: *mut *mut c_void, length: u3
6275

6376
/// Builds a new `svm_import` (returned via `import` function parameter).
6477
/// New built `svm_import_t` is pushed into `imports`
78+
///
79+
/// # Example
80+
///
81+
/// ```rust
82+
/// use std::ffi::c_void;
83+
/// use svm_runtime_c_api::{svm_imports_alloc, svm_import_func_build, testing};
84+
///
85+
/// fn foo() {
86+
/// // ...
87+
/// }
88+
///
89+
/// let count = 1;
90+
/// let mut imports = std::ptr::null_mut();
91+
/// let _res = unsafe { svm_imports_alloc(&mut imports, count) };
92+
///
93+
/// let module_name = testing::str_to_svm_byte_array("env");
94+
/// let import_name = testing::str_to_svm_byte_array("foo");
95+
/// let params = testing::svm_value_type_vec_to_array(&vec![]);
96+
/// let returns = testing::svm_value_type_vec_to_array(&vec![]);
97+
/// let func = foo as *const c_void;
98+
///
99+
/// let res = unsafe { svm_import_func_build(imports, module_name, import_name, func, params, returns) };
100+
/// assert!(res.is_ok());
101+
/// ```
102+
///
65103
#[must_use]
66104
#[no_mangle]
67105
pub unsafe extern "C" fn svm_import_func_build(
@@ -118,6 +156,23 @@ pub unsafe extern "C" fn svm_import_func_build(
118156

119157
/// Creates a new SVM Runtime instance.
120158
/// Returns it via the `runtime` parameter.
159+
///
160+
/// # Example
161+
///
162+
/// ```rust, no_run
163+
/// use svm_runtime_c_api::{svm_runtime_create, svm_imports_alloc, testing};
164+
///
165+
/// let count = 0;
166+
/// let mut imports = std::ptr::null_mut();
167+
/// let _res = unsafe { svm_imports_alloc(&mut imports, count) };
168+
///
169+
/// let mut runtime = std::ptr::null_mut();
170+
/// let path = testing::str_to_svm_byte_array("path goes here");
171+
/// let host = std::ptr::null_mut();
172+
/// let res = unsafe { svm_runtime_create(&mut runtime, path, host, imports) };
173+
/// assert!(res.is_ok());
174+
/// ```
175+
///
121176
#[must_use]
122177
#[no_mangle]
123178
pub unsafe extern "C" fn svm_runtime_create(
@@ -156,6 +211,34 @@ pub unsafe extern "C" fn svm_runtime_create(
156211
}
157212

158213
/// Deploys a new app-template
214+
///
215+
/// # Example
216+
///
217+
/// ```rust, no_run
218+
/// use svm_runtime_c_api::{svm_imports_alloc, svm_deploy_template, svm_byte_array, testing};
219+
/// use svm_common::Address;
220+
///
221+
/// // allocate imports
222+
/// let count = 0;
223+
/// let mut imports = std::ptr::null_mut();
224+
/// let _res = unsafe { svm_imports_alloc(&mut imports, count) };
225+
///
226+
/// // create runtime
227+
/// let mut kv = std::ptr::null_mut();
228+
/// let _res = unsafe { testing::svm_memory_kv_create(&mut kv) };
229+
/// let mut runtime = std::ptr::null_mut();
230+
/// let mut host = std::ptr::null_mut();
231+
/// let _res = unsafe { testing::svm_memory_runtime_create(&mut runtime, kv, host, imports) };
232+
///
233+
/// // deploy template
234+
/// let mut template_addr = svm_byte_array::default();
235+
/// let author = Address::of("@author");
236+
/// let host_ctx = svm_byte_array::default();
237+
/// let template = svm_byte_array::default();
238+
/// let res = unsafe { svm_deploy_template(&mut template_addr, runtime, author.as_ptr() as _, host_ctx, template) };
239+
/// assert!(res.is_ok());
240+
/// ```
241+
///
159242
#[must_use]
160243
#[no_mangle]
161244
pub unsafe extern "C" fn svm_deploy_template(
@@ -196,6 +279,35 @@ pub unsafe extern "C" fn svm_deploy_template(
196279
}
197280

198281
/// Spawns a new App.
282+
///
283+
/// # Example
284+
///
285+
/// ```rust, no_run
286+
/// use svm_runtime_c_api::{svm_imports_alloc, svm_spawn_app, svm_byte_array, testing};
287+
/// use svm_common::Address;
288+
///
289+
/// // allocate imports
290+
/// let count = 0;
291+
/// let mut imports = std::ptr::null_mut();
292+
/// let _res = unsafe { svm_imports_alloc(&mut imports, count) };
293+
///
294+
/// // create runtime
295+
/// let mut kv = std::ptr::null_mut();
296+
/// let _res = unsafe { testing::svm_memory_kv_create(&mut kv) };
297+
/// let mut runtime = std::ptr::null_mut();
298+
/// let mut host = std::ptr::null_mut();
299+
/// let _res = unsafe { testing::svm_memory_runtime_create(&mut runtime, kv, host, imports) };
300+
///
301+
/// let mut app_addr = svm_byte_array::default();
302+
/// let mut init_state = svm_byte_array::default();
303+
/// let creator = Address::of("@creator");
304+
/// let mut init_state = svm_byte_array::default();
305+
/// let host_ctx = svm_byte_array::default();
306+
/// let app = svm_byte_array::default();
307+
///
308+
/// let _res = unsafe { svm_spawn_app(&mut app_addr, &mut init_state, runtime, creator.as_ptr() as _, host_ctx, app) };
309+
/// ```
310+
///
199311
#[must_use]
200312
#[no_mangle]
201313
pub unsafe extern "C" fn svm_spawn_app(
@@ -242,6 +354,31 @@ pub unsafe extern "C" fn svm_spawn_app(
242354

243355
/// Parses `exec-app` raw transaction into an `AppTransaction`.
244356
/// Returns a raw reference via `app_tx` function parameter.
357+
///
358+
/// # Example
359+
///
360+
/// ```rust, no_run
361+
/// use svm_runtime_c_api::{svm_imports_alloc, svm_parse_exec_app, svm_byte_array, testing};
362+
/// use svm_common::Address;
363+
///
364+
/// // allocate imports
365+
/// let count = 0;
366+
/// let mut imports = std::ptr::null_mut();
367+
/// let _res = unsafe { svm_imports_alloc(&mut imports, count) };
368+
///
369+
/// // create runtime
370+
/// let mut kv = std::ptr::null_mut();
371+
/// let _res = unsafe { testing::svm_memory_kv_create(&mut kv) };
372+
/// let mut runtime = std::ptr::null_mut();
373+
/// let mut host = std::ptr::null_mut();
374+
/// let _res = unsafe { testing::svm_memory_runtime_create(&mut runtime, kv, host, imports) };
375+
///
376+
/// let mut app_tx = std::ptr::null_mut();
377+
/// let sender = Address::of("@sender");
378+
/// let tx = svm_byte_array::default();
379+
/// let _res = unsafe { svm_parse_exec_app(&mut app_tx, runtime, sender.as_ptr() as _, tx) };
380+
/// ```
381+
///
245382
#[must_use]
246383
#[no_mangle]
247384
pub unsafe extern "C" fn svm_parse_exec_app(
@@ -273,8 +410,44 @@ pub unsafe extern "C" fn svm_parse_exec_app(
273410
}
274411

275412
/// Triggers an app-transaction execution of an already deployed app.
276-
///
277413
/// Returns the receipt of the execution via the `receipt` parameter.
414+
///
415+
/// # Example
416+
///
417+
/// ```rust, no_run
418+
/// use std::ffi::c_void;
419+
/// use svm_runtime_c_api::{svm_imports_alloc, svm_exec_app, svm_byte_array, testing};
420+
/// use svm_app::types::AppTransaction;
421+
/// use svm_common::{State, Address};
422+
///
423+
/// // allocate imports
424+
/// let count = 0;
425+
/// let mut imports = std::ptr::null_mut();
426+
/// let _res = unsafe { svm_imports_alloc(&mut imports, count) };
427+
///
428+
/// // create runtime
429+
/// let mut kv = std::ptr::null_mut();
430+
/// let _res = unsafe { testing::svm_memory_kv_create(&mut kv) };
431+
/// let mut runtime = std::ptr::null_mut();
432+
/// let mut host = std::ptr::null_mut();
433+
/// let _res = unsafe { testing::svm_memory_runtime_create(&mut runtime, kv, host, imports) };
434+
///
435+
/// // `app_tx` should be parsed from bytes using `svm_parse_exec_app`
436+
/// let app_tx = AppTransaction {
437+
/// app: Address::of("@app"),
438+
/// sender: Address::of("@sender"),
439+
/// func_idx: 0,
440+
/// func_buf: Vec::new(),
441+
/// func_args: Vec::new()
442+
/// };
443+
///
444+
/// let app_tx_ptr = &app_tx as *const AppTransaction as *const c_void;
445+
/// let state = State::empty();
446+
/// let mut receipt = svm_byte_array::default();
447+
/// let host_ctx = svm_byte_array::default();
448+
/// let _res = unsafe { svm_exec_app(&mut receipt, runtime, app_tx_ptr, state.as_ptr() as _, host_ctx) };
449+
/// ```
450+
///
278451
#[must_use]
279452
#[no_mangle]
280453
pub unsafe extern "C" fn svm_exec_app(
@@ -331,7 +504,30 @@ pub unsafe extern "C" fn svm_instance_context_host_get(ctx: *mut c_void) -> *mut
331504
svm_ctx.host
332505
}
333506

334-
/// Destroys the Runtime and it's associated resources.
507+
/// Destroys the Runtime and its associated resources.
508+
///
509+
/// # Example
510+
///
511+
/// ```rust
512+
/// use svm_runtime_c_api::{svm_imports_alloc, svm_runtime_destroy, testing};
513+
/// use svm_common::Address;
514+
///
515+
/// // allocate imports
516+
/// let count = 0;
517+
/// let mut imports = std::ptr::null_mut();
518+
/// let _res = unsafe { svm_imports_alloc(&mut imports, count) };
519+
///
520+
/// // create runtime
521+
/// let mut kv = std::ptr::null_mut();
522+
/// let _res = unsafe { testing::svm_memory_kv_create(&mut kv) };
523+
/// let mut runtime = std::ptr::null_mut();
524+
/// let mut host = std::ptr::null_mut();
525+
/// let _res = unsafe { testing::svm_memory_runtime_create(&mut runtime, kv, host, imports) };
526+
///
527+
/// // destroy runtime
528+
/// unsafe { svm_runtime_destroy(runtime); }
529+
/// ```
530+
///
335531
#[must_use]
336532
#[no_mangle]
337533
pub unsafe extern "C" fn svm_runtime_destroy(runtime: *mut c_void) {
@@ -340,14 +536,39 @@ pub unsafe extern "C" fn svm_runtime_destroy(runtime: *mut c_void) {
340536
let _ = Box::from_raw(runtime as *mut RuntimePtr);
341537
}
342538

343-
/// Frees allocated imports resources
539+
/// Frees allocated imports resources.
540+
///
541+
/// # Example
542+
///
543+
/// ```rust
544+
/// use svm_runtime_c_api::{svm_imports_alloc, svm_imports_destroy, testing};
545+
///
546+
/// // allocate imports
547+
/// let count = 0;
548+
/// let mut imports = std::ptr::null_mut();
549+
/// let _res = unsafe { svm_imports_alloc(&mut imports, count) };
550+
///
551+
/// // destroy imports
552+
/// unsafe { svm_imports_destroy(imports); }
553+
/// ```
554+
///
344555
#[must_use]
345556
#[no_mangle]
346557
pub unsafe extern "C" fn svm_imports_destroy(imports: *const c_void) {
347558
let _ = Box::from_raw(imports as *mut Vec<svm_import_t>);
348559
}
349560

350561
/// Frees `svm_byte_array`
562+
///
563+
/// # Example
564+
///
565+
/// ```rust
566+
/// use svm_runtime_c_api::{svm_byte_array_destroy, svm_byte_array};
567+
///
568+
/// let bytes = svm_byte_array::default();
569+
/// unsafe { svm_byte_array_destroy(bytes); }
570+
/// ```
571+
///
351572
#[must_use]
352573
#[no_mangle]
353574
pub unsafe extern "C" fn svm_byte_array_destroy(bytes: svm_byte_array) {

crates/svm-runtime-c-api/src/result.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ pub enum svm_result_t {
1111
}
1212

1313
impl Into<bool> for svm_result_t {
14+
#[inline]
1415
fn into(self) -> bool {
1516
match self {
1617
svm_result_t::SVM_SUCCESS => true,
@@ -20,6 +21,18 @@ impl Into<bool> for svm_result_t {
2021
}
2122

2223
impl svm_result_t {
24+
/// Returns whether equals to `svm_result::SVM_SUCCESS`
25+
#[inline]
26+
pub fn is_ok(self) -> bool {
27+
self.as_bool() == true
28+
}
29+
30+
/// Returns whether equals to `svm_result::SVM_FAILURE`
31+
#[inline]
32+
pub fn is_err(self) -> bool {
33+
self.as_bool() == false
34+
}
35+
2336
/// Convert to boolean
2437
#[inline]
2538
pub fn as_bool(self) -> bool {

crates/svm-runtime-c-api/src/testing/mod.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,13 @@ use wasmer_runtime_core::vm::Ctx;
1818

1919
/// Creates a new in-memory `MemKVStore`.
2020
/// Returns a raw pointer to allocated kv-store via input parameter `raw_kv`
21+
#[must_use]
2122
#[no_mangle]
22-
pub unsafe extern "C" fn svm_memory_kv_create(raw_kv: *mut *mut c_void) {
23+
pub unsafe extern "C" fn svm_memory_kv_create(raw_kv: *mut *mut c_void) -> svm_result_t {
2324
let kv = svm_runtime::testing::memory_kv_store_init();
2425
*raw_kv = svm_common::into_raw_mut(kv);
26+
27+
svm_result_t::SVM_SUCCESS
2528
}
2629

2730
/// Creates a new SVM in-memory Runtime instance.

0 commit comments

Comments
 (0)