@@ -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]
67105pub 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]
123178pub 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]
161244pub 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]
201313pub 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]
247384pub 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]
280453pub 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]
337533pub 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]
346557pub 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]
353574pub unsafe extern "C" fn svm_byte_array_destroy ( bytes : svm_byte_array ) {
0 commit comments